Object 클래스는 모든 클래스의 최고의 조상이다. 따라서 Object 클래스의 멤버들은 모두 클래스에서 바로 사용 가능하다.
Object 클래스는 멤버변수는 없으며 오직 11개의 메서드를 가지고 있다. 이 메서들은 모든 인스턴스가 가져야 할 기본적인 것들이다. 여기서 이번에는 equals()
와 hashcode()
에 대해서 알아 볼 예정이다.
Object 클래스의 메서드
equals() 메서드의 실제 내용은 다음과 같이 되어있다.
public boolean equals(Object obj) {
return (this == obj);
}
this는 인스턴스 자신을 가리키는 참조변수이다. 즉 인스턴스의 주소가 저장되어 있는 것이다.
equals()
는 매개변수로 비교할 객체의 참조변수를 받아서 두 객체의 같고 다름을 참조변수의 값으로 비교하고 그 결과를 boolean 값으로 알려주는 역할을 한다.
동일성: 말그대로 "동일" 하다는 뜻으로 두 객체가 완전히 같은 경우를 말한다(같은 주소). Object 클래스의equals()
가 재정의를 하지 않는 이상 ==
와 같은 동일성 비교를 하는 것이다. 하지만 primitve type의 ==
비교는 예외로 값 비교가 가능하다.
동등성: 동등성은 두 개의 객체가 같은 정보를 갖고 있는 경우를 뜻한다. 변수가 참조하고 있는 주소값이 서로 달라도 값만 같으면 두 변수는 동등하다고 한다. String
의 Override 된 equals()
를 예로 들 수 있다.
java.lang.String.equals()
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
hashCode()
메서드는 해싱(hashing) 기법에 사용되는 "해시함수(hash function)"을 구현한 것이다. 해싱은 데이터 관리기법 중의 하나로 다량의 데이터를 저장하고 검색하는데에 유용하다. 해시 함수는 찾고자하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드(hashcode)를 반환한다.
따라서hashCode()
는 객체의 주소값으로 해시코드를 만들어 반환한다. 하지만 아주 낮은 확률로 같은 해시코드가 만들어질 수도 있기 때문에 equals
메서드와 혼용해서 쓰는 것이 좋다.
hashCode()
또한 값으로 비교할 수 있도록 Override가 가능하다. String
의 hashCode
도 역시 그렇게 Override 되어 있다.
class Ex1{
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.hashCode()); // 45123
System.out.println(str2.hashCode()); // 45123
System.out.println(System.identityHashCode(str1)); // 23498723
System.out.println(System.identityHashCode(str2)); // 1242148
}
}
System.identityHashCode()
는 Object 클래스의 hashCode()
처럼 주소값을 이용하여 해시코드를 생성한다.
Java의 정석 - 3rd Edition by. 남궁 성