String, Integer 와 같이 기본적으로 많이 사용하는 클래스들이 속해 있다.
java.lang.String, java.lang.Integerjdk/Contents/Home/src.zip 파일 압축 풀어서 java/lang 폴더를 보면 java.lang 패키지에서 제공하는 여러 소스 코드 확인 가능
외부 패키지에 선언한 클래스 사용 시 import 문으로 클래스가 어느 패키지에 속해 있는지 선언해야 한다.
java.lang 패키지는 예외!class student {
int studentID;
String studentName;
}
>>>
class Student extends Object {
int studentID;
String studentName;
}


Object 의 모든 메소드를 재정의할 수 있는 것은 아니다.
toString()을 재정의할 수 있다.String, Integer 등 여러 JDK 클래스에는 toString() 메소드가 이미 재정의되어 있다.toString() 메소드의 원형은 생성된 인스턴스의 클래스 이름과 주소 값을 보여준다.
package Object;
class Book {
int bookNumber;
String bookTitle;
Book(int bookNumber, String bookTitle) {
this.bookNumber = bookNumber;
this.bookTitle = bookTitle;
}
}
public class ToStringEx {
public static void main(String[] args) {
Book book1 = new Book(200, "개미");
System.out.println(book1);
System.out.println(book1.toString());
// 출력 결과
// Object.Book@7852e922
// Object.Book@7852e922
}
}
toString()
→ 여기서 toString() 은 Book 클래스의 메소드가 아니라 Object 클래스의 메소드Object 클래스의 toString() 메소드 원형
toString() 메소드가 호출된 경우라도 출력 결과가 '클래스 이름 @ 해시 코드 값' 이 아닌 경우가 있다.String str = new String("test");
System.out.println(str);
Integer i1 = new Integer(100);
System.out.println(i1);
// 출력 결과
// test
// 100
toString() 메소드를 미리 재정의해 두었기 때문이다.toString() 메소드를 미리 재정의한 클래스가 많다.package Object;
class Book {
int bookNumber;
String bookTitle;
Book(int bookNumber, String bookTitle) {
this.bookNumber = bookNumber;
this.bookTitle = bookTitle;
}
@Override
public String toString() {
return bookTitle + "," + bookNumber;
}
}
...
toString() 메소드를 직접 재정의하면 객체의 참조 변수를 이용해 원하는 문자열을 표현할 수 있다.package Object;
class Std {
String studentName;
int studentNo;
Std(String studentName, int studentNo) {
this.studentName = studentName;
this.studentNo = studentNo;
}
@Override
public String toString() {
return "이름 : " + studentName + ", 학번 : " + studentNo;
}
}
public class Student {
public static void main(String[] args) {
Std std = new Std("홍길동", 342341);
System.out.println(std);
}
}
package Object;
class Studentt {
int studentId;
String studentName;
public Studentt(int studentId, String studentName) {
this.studentId = studentId;
this.studentName = studentName;
}
public String toString() {
return studentId + ", " + studentName;
}
}
public class EqualsTest {
public static void main(String[] args) {
Studentt studentLee = new Studentt(100, "이상원");
Studentt studentLee2 = studentLee; // 주소 복사
Studentt studentSang = new Studentt(100, "이상원");
// 동일한 두 주소의 인스턴스 비교
if(studentLee == studentLee2) // == 기호로 비교
System.out.println("studentLee와 studentLee2의 주소는 같습니다.");
else
System.out.println("studentLee와 studentLee2의 주소는 다릅니다.");
if(studentLee.equals(studentLee2)) // equals 메소드로 비교
System.out.println("studentLee와 studentLee2는 동일합니다.");
else
System.out.println("studentLee와 studentLee2는 동일하지 않습니다.");
// 동일인이지만 인스턴스 주소 다른 경우
if(studentLee == studentSang)
System.out.println("studentLee와 studentSang의 주소는 같습니다.");
else
System.out.println("studentLee와 studentSang의 주소는 다릅니다.");
if(studentLee.equals(studentSang))
System.out.println("studentLee와 studentSang은 동일합니다.");
else
System.out.println("studentLee와 studentSang은 동일하지 않습니다.");
}
// 출력 결과
// studentLee와 studentLee2의 주소는 같습니다.
// studentLee와 studentLee2는 동일합니다.
// studentLee와 studentSang의 주소는 다릅니다.
// studentLee와 studentSang은 다릅니다
}
equals() 메소드 결과가 true 가 된다.== : 물리적으로 같은 메모리 주소인지 여부 확인equals() : 재정의하여 논리적으로 같은 인스턴스인지(메모리 주소가 다르더라도 같은 학생인지) 확인하도록 구현 가능String, Integer 클래스에는 equals() 메소드가 이미 재정의되어 있다.package Object;
public class StringEquals {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = new String("abc");
// 물리적 동일성 체크 > 주소 동일 여부
System.out.println(str1 == str2);
// 논리적 동일성 체크 > 값 동일 여부
System.out.println(str1.equals(str2));
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
// 상동
System.out.println(i1 == i2);
System.out.println(i1.equals(i2));
}
}
// 출력 결과
// false
// true
// false
// true
String 클래스에서 equlas() 메소드는 같은 문자열의 경우 true, 그렇지 않은 경우 false 반환하도록 재정의되어있다.Integer 클래스도 마찬가지로 정수 값이 같은 경우 true 를 반환하도록 메소드가 재정의되어 있음을 알 수 있다.<aside> 💡 해시(hash) ; 정보를 저장하거나 검색할 때 사용하는 자료 구조
객체정보
index = hash(key)
저장위치 해시함수
</aside>
<aside> 💡 1. String word1 = new String("good"); 2. String word2 = "bad";
</aside>
package string;
public class StringTest1 {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = new String("abc");
// 인스턴스가 매번 새로 생성되기 때문에 str1 과 str2 의 주소 값이 다름
System.out.println(str1 == str2); // false;
System.out.println(str1.equals(str2)); // true
String str3 = "abc";
String str4 = "abc";
// 문자열 abc 는 상수 풀에 저장되어 있기 때문에 가리키는 주소 값이 같음
System.out.println(str3 == str4); // true;
System.out.println(str3.equals(str4)); // true
}
}