Item 10 : equals는 일반 규약을 지켜 재정의하라
2021. 7. 10. 00:52
이번 장부터의 주제는 "모든 객체의 공통메서드" 이다.
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를 오버라이딩해서 사용하는데
위에서 말한 애로사항이 있을 때는 어느정도 커스터마이징이 필요하다.
그럴 경우에 다시 이 포스팅에 와서 추가적인 정보를 덧붙이겠다.
'책 > 이펙티브자바' 카테고리의 다른 글
Item 12 : toString을 항상 재정의하라 (0) | 2021.07.12 |
---|---|
Item 11 : equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2021.07.11 |
Item 9 : try-finally 보다는 try-with-resources를 사용하라 (0) | 2021.07.09 |
Item 8 : finalizer와 cleaner 사용을 피하라 (0) | 2021.07.08 |
Item 7 : 다 쓴 객체 참조를 해체하라 (0) | 2021.07.06 |