본문 바로가기

Programming/JAVA

[Effective JAVA] 모든 객체의 공통 메서드 (2) equals의 재정의와 hashCode

item 11. Equals를 재정의하려면 hashCode도 재정의 하라

  • equls를 재정의한 클래스 모두에서 hashCode도 재정의해야 함
  • 그렇지 않으면 hashCode 일반 규약을 어겨 해당 클래스의 인스턴스를 HashMap이나 HashSet과 같은 컬렉션의 원소로 사용할 때 문제가 발생함
Object 명세의 규약

- equals 비교에 사용되는 정보가 변경되지 않는다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 함. 단, 애플리케이션을 다시 실행한다면 값이 달라져도 무관함.

- equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 같은 값을 반환해야 함

- equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 다른 값을 반환할 필요는 없음. 단, 다른 객체에 대해 다른 값을 반환해야 해시테이블 성능이 좋아짐

  • hashCode 재정의를 잘못했을 때 크게 문제가 되는 조항은 두 번째임.
    즉, 논리적으로 같은 객체는 같은 해시코드를 반환해야하기 때문.

  • item 10에서 보았듯 equals는 물리적으로 다른 두 객체를 논리적으로 같다고 판단할 수 있음.
    하지만 Object의 기본 hashCode 메서드는 이 둘이 전혀 다르다고 판단해 규약과 달리 서로 다른 값을 반환함.