<aside> 💡
equals 를 구현했다면 3가지를 더 체크해보자
equals 메서드를 재정의하지 않고 그냥 두면, 그 클래스의 인스턴스는 오직 자기 자신과만 같게 된다!
</aside>
→ equals 를 Override 하는 순간 개발자는 그 객체에 대해서 책임을 져야한다
각 인스턴스가 본질적으로 고유할때
인스턴스의 **‘논리적 통치성(두 객체가 논리적으로 동일한지)’**을 검사할 일이 없을 때
상위 클래스에서 재정의한 equals 가 하위 클래스에도 딱 들어맞을 때
ex) Set은 AbstractSet이 구현한 equals를 상속, List는 AbstractList, Map은 AbstractMap
AbstractSet 예시
클래스가 private이나 package-private이고 equals를 호출할 일이 없을 때
equals가 실수로라도 호출되는 걸 막는 법
@Override
public boolean equals(Object o) {
throw new AssertionError(); // 호출 금지!
}
동치 클래스 : 집합을 서로 같은 원소들로 이루어진 부분집합으로 나누는 연산
→ equals 메서드가 쓸모 있으려면 모든 원소가 같은 동치류에 속한 어떤 원소와도 교환이 가능해야함
null
이 아닌 모든 참조 값 x에 대해, x.equals(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에 대해, x.equals(null)
은 false
객체가 자기 자신과 같아야함
public class Test {
private String name;
public Test(String name) {
this.name = name;
}
public static void main(String[] args) throws Exception {
Set<Test> set = new HashSet<>();
Test test = new Test("java");
set.add(test);
System.out.println(set.contains(test)); // false일 경우, 반사성을 만족하지 못하는 경우이다.
// true 출력
}
}