notify()
, wait()
등은 쓰레드와 관련된 메서드이다.(여기서는 다루지 않음)Object 클래스의 메서드 | 설명 |
---|---|
protected Object clone() | 객체 자신의 복사본을 반환 |
public boolean equals(Object obj) | 객체 자신과 객체 obj가 같은 객체인지 비교 |
protected void finalize() | 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출 이 때 수행되어야 하는 코드가 있을 때 오버라이딩한다. (거의 사용 X - Java9부터는 사용 불가) finalize 더 알아보기 |
public Class getClass() | 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환 Class : 클래스 정보를 담기위한 클래스(일종의 설계도 객체) |
public int hashCode() | 객체 자신의 해시코드를 반환 |
public String toString() | 객체 자신의 정보를 문자열로 반환 |
public boolean equals(Object obj){
return (this == obj);
}
오버라이딩
해서 사용하면 된다.// Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교
@Override
public boolean equals(Object obj){
// 참조 변수의 형변환 전에는 반드시 instanceof로 확인해야한다.
if(!(obj instanceof Value)){
return false;
}
Value v = (Value)obj; // 형변환을 해주어야 한다. - 다형성
return this.value == v.value;
}
hashCode()
는 객체의 주소를 int로 변환해서 반환public class Object{
...
public native int hashCode(); //native 메서드 : OS의 메서드(C언어)
//Java가 아닌 언어를 Java처럼 쓸 수 있게 해주는 메서드
}
equals()
를 오버라이딩하면, hashCode()
도 오버라이딩해야 한다.equals()
의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문!
주소가 아닌 인스턴스 변수의 비교를 하기 때문에 hashCode()
가 같은 값이 나오게 된다.
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.hashCode()); // 96354
System.out.println(str2.hashCode()); // 96354
System.identityHashCode(Object obj)
는 Object 클래스의 hashCode()
와 동일
hashCode()
오버라이딩 하기 전의 값이라고 보면 된다.System.out.println(System.identityHashCode(str1)); // 3526198
System.out.println(System.identityHashCode(str2)); // 7699183
public class Main {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
// 같은 객체가 됨. String을 new String으로 만들지 않는 것과 차이가 있다.
System.out.println(System.identityHashCode(str1)); // 1163157884
System.out.println(System.identityHashCode(str2)); // 1163157884
}
}
64bit JVM으로 바뀌면서 주소 값이 8비트로 표현이 되는데, 현재에도 hashCode()
메서드는 int로 관리가 되기 때문에 4비트로 표현이 되고 있다.
참고 : String 클래스의 equals()
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
toString()
: 객체를 문자열(String)으로 변환하기 위한 메서드public String toString() { // Object 클래스의 toString()
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}