본문 바로가기

이펙티브 자바

[이펙티브 자바] 아이템 11. equals를 재정의하려거든 hashcode도 재정의하라

hashcode : 객체를 대표하는 정수 값. hashCode() 메서드를 통해 이 값을 얻는다. 객체의 hashcode는 객체를 저장하거나 검색할때 hash table같은 데이터 구조의 로 사용된다. 

 

equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다.

그렇지 않으면 hashCode 일반 규약을 어기게 되어 오류가 발생할 수 있다.

 

1. 프로그램 실행 중 동일한 객체에 대해 여러 번 hashCode() 메서드를 호출하면, 객체가 수정되지 않았다면 메서드는 항상 동일한 정수를 반환해야 한다. 이 값은 객체가 수정되지 않는 한 프로그램 재실행 간에도 일관되어야 한다.

 

2. equals(Object) 메서드가 두 객체를 동등하게 판단한다면, 두 객체의 hashCode() 메서드는 동일한 정수 값을 반환해야 한다.

 

3. equals(Object) 메서드가 두 객체를 다르게 판단한다 하더라도, 두 객체의 hashCode() 메서드가 서로 다른 정수 값을 반환할 필요는 없다. 그러나, 다른 객체에 대해 다른 해시 코드를 생성하는 것이 해시 테이블의 성능을 향상시킨다.

 

 

결론 : equals를 재정의할 때는 hashcode도 반드시 재정의해야 한다.

하지만 AutoValue 프레임워크를 사용하면 equals와 hashCode를 자동으로 만들어주니 hashCode를 직접 재정의하는 방법을 외울 필요는 없는것 같다.