Java/이펙티브 자바(Effective Java)

[이펙티브 자바(Effective Java)][모든 객체의 공통 메서드] - 11. equals를 재정의하려거든 hashCode도 재정의하라

얄루몬 2022. 4. 12. 18:31

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다.


[equals를 재정의하면 hashCode도 재정의 해야 한다.]

  1. equals 비교에 사용되는 정보가 변경되지 않았다면, hashCode 도 변하면 안 된다.
    (애플리케이션을 다시 실행한다면 이 값이 달라져도 상관 없음)
  2. equals가 두 객체가 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환한다.
    → 논리적으로 같은 객체는 같은 해시코드를 반환해야 한다.
  3. equals가 두 객체를 다르다고 판단했더라도, hashCode는 꼭 다를 필요는 없다.
    하지만, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다.

 

이를 지키지 않을 때 2번 규약에서 큰 문제가 일어나게 된다. 그렇기에 꼭 equals를 재정의하면 hashCode도 재정의 해야 합니다.

 

[핵심 정리]

  • equals를 재정의할 떄는 hashCode도 반드시 재정의해야 한다.
    • 그렇지 않으면 프로그램이 제대로 동작하지 않을 것이다.
  • 재정의한 hashCode는 Object API 문서로 기술된 일반 규약을 따라야 한다.
  • 서로 다른 인스턴스라면 되도록 해시코드도 서로 다르게 구현해야 한다.
    • AutoValue 프레임워크를 사용하면 멋진 equals와 hashCode를 자동으로 만들어준다.

 

*가능하면 2회독 한 뒤에 다시 정리하자.