더북(TheBook)

hashCodeequals 메서드는 반드시 호환되어야 한다. 예를 들어 x.equals(y)x.hashCode() = = y.hashCode()여야 한다. 앞에서 제시한 알고리즘에서 알 수 있듯이 같은 문자로 구성된 문자열은 같은 해시 코드를 만들어 내므로 String 클래스는 이 규칙을 잘 따른다.

Object.hashCode 메서드는 구현체 나름의 방식으로 해시 코드를 만들어 낸다. 구현체는 객체의 메모리 주소나 객체와 함께 캐시되는 숫자(순차적 숫자나 의사 난수) 또는 이 둘의 조합으로 해시 코드를 만들 수 있다. Object.equals는 객체가 같은지 검사하므로 동일 객체들의 해시 코드를 같게 만들면 된다.

equals 메서드를 재정의한다면 hashCode 메서드도 재정의해서 equals와 호환되게 해야 한다. 이렇게 하지 않으면 클래스의 사용자가 해시 집합이나 해시 맵에 객체를 넣다가 잃을 수도 있다.

hashCode 메서드 안에서 인스턴스 변수의 해시 코드를 단순히 결합하면 된다. 다음은 Item 클래스의 hashCode 메서드다.

class Item {

    ...

    public int hashCode() {

        return Objects.hash(description, price);

    }

}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.