item 11. Equals를 재정의하려면 hashCode도 재정의 하라
- equls를 재정의한 클래스 모두에서 hashCode도 재정의해야 함
- 그렇지 않으면 hashCode 일반 규약을 어겨 해당 클래스의 인스턴스를 HashMap이나 HashSet과 같은 컬렉션의 원소로 사용할 때 문제가 발생함
Object 명세의 규약
- equals 비교에 사용되는 정보가 변경되지 않는다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 함. 단, 애플리케이션을 다시 실행한다면 값이 달라져도 무관함.
- equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 같은 값을 반환해야 함
- equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 다른 값을 반환할 필요는 없음. 단, 다른 객체에 대해 다른 값을 반환해야 해시테이블 성능이 좋아짐
- hashCode 재정의를 잘못했을 때 크게 문제가 되는 조항은 두 번째임.
즉, 논리적으로 같은 객체는 같은 해시코드를 반환해야하기 때문. - item 10에서 보았듯 equals는 물리적으로 다른 두 객체를 논리적으로 같다고 판단할 수 있음.
하지만 Object의 기본 hashCode 메서드는 이 둘이 전혀 다르다고 판단해 규약과 달리 서로 다른 값을 반환함.
'Programming > JAVA' 카테고리의 다른 글
[Effective JAVA] item 21 : 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) | 2021.07.03 |
---|---|
[Effective JAVA] item 20 : 추상 클래스 보다는 인터페이스를 우선하라 (0) | 2021.07.03 |
[Effective JAVA] 모든 객체의 공통 메서드 (1) Equals 메소드의 재정의 (0) | 2021.06.27 |
Java의 Enum 활용 (0) | 2021.06.26 |
[Effective JAVA 3S/E] 객체 생성과 파괴 - item1 (0) | 2021.06.18 |