equals 는 Object 에 있는 객체가 같다는 것에 대해 정의하고 있는 메서드이다.
그러나, 많은 라이브러리들이 equals를 일반 규약에 맞추어 사용하므로 잘못 구현하면 의도치 않게 동작할 것이다.
다음과 같은 경우 재정의하지 않는 것이 좋다
각 인스턴스가 본질적으로 고유함 - equals를 쓸 필요가 없으니까
논리적 동치성을 검사할 일이 없음 - 마찬가지
상위 클래스에서 정의한 equals 가 하위 클래스에서도 딱 맞아 떨어짐
클래스가 private 이거나 package-private
인 경우
참고.
package-private: 클래스가 같은 패키지 내에서만 접근 가능한 경우
그러므로 필요 시 일반 규약에 맞추어 구현할 필요가 있다.
반사성: x.equals(x) 는 true이다.
대칭성: x.equals(y) 가 true 이면, y.equals(x) 도 true 이다.
추이성: x.equals(y), y.equals(x) 가 true 이면 z.equals(x) 도 true 이다.
일관성: x.equals(y) 가 true 이면 반복 호출해도 true 이다.
그렇다면 일반 규약을 지키기 쉬울까?
x,y 두 점을 같은 Point 객체가 존재할 때, color 값을 갖고 Point를 상속하는 객체 ColorPoint 에서 각각 equals 를 구현했을 때,
구체 클래스를 확장해 새로운 값을 추가하면서 equals 규약을 만족시킬 방법은 존재하지 않는다
사실 가능은 하다. LSP를 깨버리면 -> 자바 쓰지 마셈
우회도 가능하다 상속 대신 컴포지션을 사용하면 된다