Java ‐ equals를 재정의하려거든 hashCode도 재정의하라[Effective Java Item 11] - dnwls16071/Backend_Summary GitHub Wiki

equals를 재정의하려거든 hashCode도 재정의하라

  • equals를 재정의한 클래스 모두에서 hashCode() 메서드도 재정의해야 한다.
  • Object 명세에서 equals는 기본적으로 물리적 동치성을 기준으로 비교한다.
  • equals(Object)가 두 객체를 같다고 판단했다면 두 객체의 hashCode는 똑같은 값을 반환해야 한다.
  • hashCode 재정의를 잘못하게 되면 문제가 발생한다. 논리적 동치성의 결과가 true인 객체는 같은 해시 코드를 반환해야 한다.
  • equals, hashCode를 직접 재정의하기보다는 IDE에게 맡기는 것이 더 정확하다.
// equals() 메서드 재정의
@Override
public boolean equals(Object o) {
    // 1. 자기 자신과의 비교
    // 두 객체의 참조값이 같으면(메모리 주소가 같으면) 당연히 true
    if (this == o) {
        return true;
    }

    // 2. null 체크 및 타입 비교
    // 비교 대상이 null이거나, 현재 클래스와 다른 타입이면 false
    if (o == null || getClass() != o.getClass()) {
        return false;
    }

    // 3. 필드 값 비교
    // Object 타입으로 전달된 객체를 Person 타입으로 캐스팅합니다.
    Person person = (Person) o;
    return age == person.age && Objects.equals(name, person.name);
}

// hashCode() 메서드 재정의
@Override
public int hashCode() {
    // Objects.hash()를 사용하여 필드들의 해시 코드를 조합하여 반환합니다.
    // equals()에서 사용한 필드들과 동일한 필드를 사용해야 합니다.
    return Objects.hash(name, age);
}