<aside> 💡 *equals 메서드는 재정의하기 쉬워 보이지만, 자칫하면 끔찍한 결과를 초래한다!*

</aside>

아래의 상황 중 하나에 해당된다면, 재정의하지 않는 것이 최선이다.

  1. 각 인스턴스가 본질적으로 고유하다.
  1. 인스턴스의 논리적 동치성(logical equality)을 검사할 일이 없다.
  1. 상위 클래스에서 재정의한 equals 가 하위 클래스에도 딱 들어맞는다.
  1. 클래스가 private 이거나 package-private 이고 equals 메서드를 호출할 일이 없다.
@Override
public boolean equals(final Object o) {
		throw new AssertionError(); // 호출 금지!
}

그렇다면 언제 equals 를 재정의해야 할까?

두 객체가 물리적으로 같은지가 아닌 논리적 동치성을 확인해야 하는데, 상위 클래스의 equals 가 논리적 동치성을 비교하도록 재정의되지 않았을 때!