Java에서 모든 클래스의 부모 클래스인 Object 클래스는 toString을 비롯해 equals hashCode라는 메서드를 갖고 있다.

즉, 모든 클래스는 toString 과, equals, hashCode 를 갖고 있다고 볼 수 있으며 이는 자바 객체들의 특징이라고 할 수 있다.

여기에서 헷갈리는 부분이 equals와 hashCode 의 차이이며, 아래는 그 내용을 정리한 글이다.



 Equals는 두 객체의 내용이 같은지 동등성(equality)을 비교하며 hashCode는 두 객체가 같은 객체인지 동일성(identity)을 비교하는 역할을 한다.


 즉 hashCode를 사용하면 두 객체의 참조 비교를 하며 완전히 같은지를 판단한다.

 참고로 Java Map put 당시의 hashCode를 기록하므로 hashCode함수를 오버라이딩하여 구현할 시 중간에 값의 변경으로 hashCode가 변경되지 않도록 유의해야 한다.


 다음은 hashCode() 와 관련해서 정의된 규약이다.


-      equals()로 비교시 두개의 오브젝트가 같다면 hashCode() 값도 같아야 한다.


-      Equals()로 비교시 false라면 hashCode() 값은 같을수도 다를수도 있다. 성능을 위해서는 hashCode() 값이 다른 것이 낫다.


-      hashCode() 값이 같다고 해서 equals() true인 것은 아니다. 해싱 알고리즘 문제로 같은 해시값이 나올 수 있다.

 

: 다음은 equals() 와 관련된 규약이다.


-      Reflexive : Object는 그 자신과 항상 equals해야 한다.


-      Symmetric : a.equals(b) 일때 b.equals(a) 는 성립해야 한다.


-      Transitive : a.equals(b) 이고 b.equals(c) 라면 c.equals(a) 는 성립한다.


-      Consistent : equals의 호출은 객체가 변하지 않는 이상 항상 같은 결과를 반환해야 한다.


-      Null comparison : null과의 equals 비교는 NPE가 아닌 false를 반환해야 한다.



위 내용은 다음 블로그를 많이 참조 하였다. 

(http://anster.tistory.com/160, http://iilii.egloos.com/4000476)



+ Recent posts