반응형
이 내용은 이펙티브 자바 Effective Java 3/E
를 읽으면서 정리한 내용을 포함하고 있습니다.
equals
메소드는 재정의하기 쉬워 보이지만 잘못 수정하게 된다면 자칫하면 끔직한 결과를 초래할 수 있습니다.
재정의
다음에 열거한 상황 중 하나에 해당된다면 재정의하지 않는 것이 최선입니다.
- 각 인스턴스가 본질적으로 고유하다
- 인스턴스의
논리적 동치성
을 검사할 일이 없다 - 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다.
- 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다
그럼, 재정의해야 할 때는 언제일까요?
- 객체 식별성이 아니라 논리적 동치성을 확인해야 하는데, 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의되지 않았을 때입니다. 주로 값 클래스가 해당됩니다. Integer와 String처럼 값을 표현하는 클래스를 말합니다.
- 두 값 객체를 equals로 비교하는 프로그래머는 객체가 같은지가 아니라 값이 같은지를 알고 싶어하기 때문에, equals가 논리적 동치성을 확인하도록 재정의해야 합니다.
Object 명세
equals 메서드는 동치관계를 구현하며, 다음을 만족합니다.
- 반사성
- 대칭성
- 추이성
- 일관성
- null-아님
equals 규약을 어기면 그 객체를 사용하는 다른 객체들이 어떻게 반응할지 알 수 없습니다.
주의사항
- equals를 재정의할 땐 hashCode도 반드시 재정의하자
- 너무 복잡하게 해결하려 들지 말자
- 필드들의 동치성만 검사해도 equals 규약을 어렵지 않게 지킬 수 있습니다.
- Object 외의 타입을 매개변수로 받는 equals 메소드는 선언하지 말자
사용방법
사람이 직접 작성하는 것보다는 IDE 또는 제공해주는 라이브러리를 사용하는 것이 좋습니다. 직접 수정하다가 부주의할 실수를 저지르지는 않으니 말입니다.
- IDE를 활용한 equals 생성
- 롬북 어노테이션을 활용한 생성
정리
- 꼭 필요한 경우가 아니면 equals를 재정의 하지 말아야 합니다.
- 많은 경우에 Object의 equals가 비교를 정확히 수행해줍니다.
- 재정의해야 할 때는 그 클래스의 핵심 필드 모두를 빠짐없이, 다섯 가지 규약을 확실히 지켜가며 비교해야 합니다.
- 재정의 해야 한다면
IDE
또는롬북
을 통하여 진행합니다.
반응형
'독서이야기 > 이펙티브 자바 3 edition' 카테고리의 다른 글
[아이템12] toString을 항상 재정의하라 (0) | 2022.09.18 |
---|---|
[아이템11] equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2022.09.18 |
[아이템9] try-finally 보다는 try-with-resources (0) | 2022.09.03 |
[아이템8] finalizer와 cleaner 사용을 피하라 (0) | 2022.09.03 |
[아이템7] 다 쓴 객체 참조를 해제하라 (0) | 2022.09.03 |
댓글