728x90
equals는 일반 규약을 지켜 재정의하라
equals를 재정의 하지 않아도 되는 상황
- 각 인스턴스가 본질적으로 고유한 경우
- 인스턴스의 '논리적 동치성(logical equality)'을 검사할 일이 없는 경우
- 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는 경우
- 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없는 경우
equals를 재정의 해야하는 상황
equals를 재정의 해야 할 때는 객체 식별성(두 객체가 물리적으로 같은가)가 아닌 논리적 동치성을 확인해야 한다.
상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의 하지 않았을 때이다.
예) 값 클래스
값 클래스란 Integer과 String 클래스 처럼 값을 표현하는 클래스이다.
개발자는 String과 같은 객체가 물리적 주소가 같은지 확인하는 것이 아닌 String 객체가 갖고 있는 값을 확인할 때가 많다.
String x = "hello";
String y = "hello";
x.equals(y);
equals 재정의 규약
- 반사성(reflexivity) : null이 아닌 모든 참조 값 x에 대해 x.equals(x)는 true다.
- 대칭성(symmetry) : null이 아닌 모든 참조 값 x, y에 대해, x.equals(y)가 true면 y.equals(x)도 true다.
- 추이성(transitivity) : 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 재정의 하지마라
728x90
'EFFECTIVE JAVA' 카테고리의 다른 글
EFFECTIVE JAVA TIL 12 - 모든 객체의 공통 메서드 / 아이템 12 (0) | 2024.08.02 |
---|---|
EFFECTIVE JAVA TIL 11 - 모든 객체의 공통 메서드 / 아이템 11 (0) | 2024.08.02 |
EFFECTIVE JAVA TIL 08 - 객체 생성과 파괴 / 아이템 8 (2) | 2024.07.25 |
EFFECTIVE JAVA TIL 07 - 객체 생성과 파괴 / 아이템 7 (2) | 2024.07.25 |
EFFECTIVE JAVA TIL 06 - 객체 생성과 파괴 / 아이템 6 (0) | 2024.07.25 |