2009. 8. 31. 12:57

객체가 같다는 것은 (equals & HashCode)


출처 행복을 만들어가는 집 | 좋은일
원문 http://blog.naver.com/marsflower/140064033646

* 레퍼런스 동치

   힙에 있는 한 객체를 서로 다른 레퍼런스로 참조할 경우

 

* 객체 동치

   힙에 객체가 두 개 들어있고, 두 레퍼런스가 각 객체를 참조하지만 두 객체가 동치인것으로 간주될 경우 - 이때에는 Object클래스로부터 상속 받은 hashcode()와 equal() 메소드를 전부 오버라이드해야 합니다.

 

* hashCode()와 equals()

   - 두 객체가 같으면 반드시 같은 해시코드를 가져야 한다.

   - 두 객체가 같으면 equals() 메소드를 호출했을 때 true를 리턴해야 한다. 즉 a, b가 같으면 a.equals(b)와 b.equals(a) 둘 다 true여야 한다.

   - 두 해시코드가 값이 같아고 해서 반드시 같은 것은 아니다. 하지만 두 객체가 같으면 두 해시코드는 반드시 같아야 한다.

   - equals()를 오버라이드하면 반드시 hashCode()도 오버라이드해야 한다.

   - hashCode에서는 기본적으로 힙에 있는 각 객체마다 서로 다른 값을 가지는 유일한 정수를 리턴합니다. 클래스에서 hashCode() 메소드를 오버라이드하지 않으면 절대로 그 유형의 두 객체가 같은 것으로 간주될 수 없습니다.

   - equals() 메소드에서는 기본적으로 == 연산자를 써서 객체를 비교합니다. 즉, 두 레퍼런스가 힙에 있는 한 객체를 참조하는 지를 혹인하죠. 따라서 equals()를 오버라이드하지 않으면 절대 그 유형의 객체가 같은 것으로 간주될 수 없습니다. 서로 다른 객체에 대한 레퍼런스에 들어 있는 비트들이 같을 수 없기 때문입니다.

   - a.equals(b)가 true라면  a.hashCode() == b.hashCode()도 성립합니다.

     하지만 a.hashCode() == b.hashCode()가 성립해도 a.equals(b)가 반드시 true인 것은 아닙니다. 즉 해시코드 값을 써서 범위를 좁힐 수는 있지만 정확학 매치되는 것을 찾으려면 같은 통에 있는 모든 객체에 대해서 equals() 메소드를 서서 정말 같은 객체인지 확인해야 합니다.

 
Trackback 0 Comment 0