이번 장부터의 주제는 "모든 객체의 공통메서드" 이다.

Object의 메소드들(equals, hashCode, toString..)등의 메소드 구현 방법에 대한 내용이 주를 이룰 것이다.

 

아이템 10의 주제는 equals의 재정의 이며

저자의 결론부터 보고 시작 하자면

꼭 필요한 경우가 아니면 재정의 하지 말자 이다.

 

equals 메소드를 재정의 하지 않아도 되는 경우는 다음과 같다.

  • 각 인스턴스가 본질적으로 고유하다
  • 인스턴스의 '논리적 동치성'을 검사할 일이 없다.
  • 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다.
  • 클래스가 private이거나 package-private이고 equals 메소드를 호출할 일이 없다.

 

 

equals를 재정의 해야하는 경우는 객체 식별성이 아닌 논리적 동치성을 확인하고 싶을 때이다.

그러나 재정의 하는 경우에는 다음과 같은 일반 규약을 따라야 한다.

- 반사성 : null이 아닌 모든 참조 값 x에 대해 x.euqals(x)는 true다

- 대칭성 : null이 아닌 모든 참조값 x,y에 대해 x.equals(y)가 true면 y.equals(x)도 true다.

- 추이성 : null이 아닌 모든 참조값 x,y,z에 대해 x.equals(y)가 true이고 y.equals(z)가 true면
          x.equals(z)도 true다.

- 일관성 : null이 아닌 모든 참조값 x,y에 대해 x.equals(y)를 반복해서 호출하면 항상 true를 반환하거나
          항상 false를 반환한다.

- null 아님 : null이 아닌 모든 참조 값 x,y에 대해, x.equals(null)은 false다.

우리는 무의식적으로 equals와 hashcode를 오버라이딩해서 사용하는데

위에서 말한 애로사항이 있을 때는 어느정도 커스터마이징이 필요하다.

그럴 경우에 다시 이 포스팅에 와서 추가적인 정보를 덧붙이겠다.

+ Recent posts