객체의 hashcode에 대한 고찰 그거/Java2007. 8. 9. 18:26
# hashcode
대부분 버전의 Java 에서 hashcode는 Heap에 있는 객체의 메모리 주소를 바탕으로 생성됩니다.
따라서 서로 다른 객체가 같은 hashcode를 가질 수는 없습니다.
# 두 객체가 같다는 것의 의미는?
1. reference 동치
Heap에 있는 한 객체를 서로 다른 reference로 참조하는 경우
두 reference에 대해서 hashCode() method를 호출하면 똑같은 결과가 나옵니다.
String a = "test";
String b = "test";
System.out.println("# a.hashCode() : " + a.hashCode());
System.out.println("# b.hashCode() : " + b.hashCode());
# a.hashCode() : 3556498
# b.hashCode() : 3556498
2. 객체 동치
Heap에 객체가 두 개 들어있고, 두 reference가 각 객체를 참조하지만 그 두 객체가 동치인 것으로 간주할 수 있는 경우
Object class로부터 상속받은 hashCode() 와 equals() method를 모두 override 해야 합니다.
hashCode() method를 override 하지 않으면 기본적으로 객체마다 유일한 hashcode 값을 반환하게 됩니다.
# hashCode() 와 equals() 에 관련된 규칙
2. 두 객체가 같으면 equals() method를 호출했을 때 true를 반환해야 한다.
즉, a, b가 같으면 a.equals(b)와 b.equals(a) 둘 다 true 여야 한다.
3. 두 객체의 hashcode 값이 같다고 해서 반드시 같은 것은 아니다.
하지만 두 객체가 같으면 두 hashcode는 반드시 같아야 한다.
4. equals()를 override 하면 반드시 hashCode()도 override 해야 한다.
5. hashCode() 에서는 기본적으로 Heap에 있는 각 객체마다 서로 다른 값을 가지는 유일한 정수를 반환합니다.
Class에서 hashCode() method를 override 하지 않으면 절대로 그 유형의 두 객체가 같은 것으로 간주될 수 없습니다.
6. equals() method 에서는 기본적으로 == 연산자를 써서 객체를 비교합니다.
즉, 두 reference가 Heap 에 있는 한 객체를 참조하는지를 확인하죠.
따라서 equals()를 override 하지 않으면 절대 그 유형의 두 객체가 같은 것으로 간주될 수 없습니다.
서로 다른 객체에 대한 reference에 들어있는 bit들이 같을 수가 없으니까요.
7. a.equals(b)가 true 라면 a.hashCode() == b.hashCode() 도 성립합니다.
하지만 a.hashCode() == b.hashCode() 가 성립해도 a.equals(b) 가 반드시 true 인 것은 아닙니다.
# hashCode() method 에서 사용하는 'Hashing Algorithm' 에서 서로 다른 객체들에 대해 같은 hashcode 값을 만들어낼 수 있기 때문에
객체가 같지 않더라도 hashcode는 같을 수 있습니다.
'그거 > Java' 카테고리의 다른 글
JDK 5.0의 새로운 기능 Generics (1) | 2007.08.13 |
---|---|
java Collection 들 (0) | 2007.08.10 |
The Factory Method Pattern - Design Patterns in Java - (1) | 2007.05.30 |
MVC 기반 게시판 만들기 (2) | 2007.04.27 |
Collection Framework (0) | 2007.04.23 |