[Effective Java] 아이템 10 - equals는 일반 규약을 지켜 재정의하라

HyeBin, Park·2022년 5월 8일
0

Effective Java Study

목록 보기
8/20
post-thumbnail

아이템 10 : equals는 일반 규약을 지켜 재정의하라

💡 object 메서드중 final이 아닌 메서드는 모두 재정의를 염두에 두고 설계된 것

🔎 Object.equals()

재정의 하지 않아야할 경우

  • 각 인스턴스가 본질적으로 고유하다.
    • 값을 표현하는 것이 아닌 동작하는 개체를 표현하는 클래스
    • ex) Thread
  • 인스턴스의 논리적 동치성을 검사할 일이 없다.
  • 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어 맞는다.
  • 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다. 아래의 코드로 equals 호출 금지로 만든다.
    @Override public boolean equals(Object o) {
        throw new AssertionError(); 
    }

재정의 해야하는 경우

  • 객체 식별성이 아닌 논리적 동치성을 확인해야하는데 상위 클래스의 equals가 논리적 동치성을 비교하지 않을 경우(주로 값클래스)
    • 값 클래스라도 값이 같은 인스턴스가 둘 이상 만들어지지 않으면 재정의 하지 않아도 된다.

equals 메서드 재정의 규약

  • equals 메서드는 동치관계를 구현한다.
  • 반사성(reflexivity) : null이 아닌 모든 참조 값 x에 대해, x.equals(x)는 true다.
  • 대칭성(symmetry) : null이 아닌 모든 참조 값 x,y에 대해, x.equals(y)가 true면 y.equals(x)도 true다.
  • 추이성(transivity) : null이 아닌 모든 참조 값 x,y,z에 대해, x.equals(y)가 true이고 y.equals(z)도 true면 x.equals(z)도 true다.
  • 일관성(consistency) : null이 아닌 모든 참조 값 x,y에 대해, x.equals(y)를 반복해서 호출하면 항상 true를 반환하거나 false를 반환한다.
  • null-아님 : null이 아닌 모든 참조 값 x에 대해, x.equals(null)은 false다.

양질의 equals 메서드 구현 방법

  1. == 연산자를 사용해 입력이 자기 자신의 참조인지 확인한다. -> 최적화
  2. instanceof 연산자로 입력이 올바른 타입인지 확인한다.
  3. 입력을 올바른 타입으로 형변환한다.
  4. 입력 객체와 자기 자신의 대응되는 핵심 필드들이 모두 일치하는지 하나씩 검사한다.

0개의 댓글