<aside> 💡

equals 를 구현했다면 3가지를 더 체크해보자

  1. 대칭적인가?
  2. 추이성이 있는가?
  3. 일과적인가?

equals 메서드를 재정의하지 않고 그냥 두면, 그 클래스의 인스턴스는 오직 자기 자신과만 같게 된다!

</aside>

→ equals 를 Override 하는 순간 개발자는 그 객체에 대해서 책임을 져야한다

equals 를 재정의 하면 안되는 경우

  1. 각 인스턴스가 본질적으로 고유할때

    1. 값 클래스(Integer 나 String 처럼 값을 표현하는 클래스) 가 아닌 동작하는 개체를 표현하는 클래스
      1. ex) Thread
  2. 인스턴스의 **‘논리적 통치성(두 객체가 논리적으로 동일한지)’**을 검사할 일이 없을 때

    1. ex) java.util.regex.Pattern
      1. Pattern 클래스는 정규 표현식을 다루는 클래스
      2. 이 클래스는 문자열에서 특정 패턴을 찾는 데 사용되며, 동작 중심의 클래스 → 즉, Pattern의 인스턴스들은 어떻게 동작하느냐에 초점을 맞추며, 논리적으로 같은지를 비교할 필요가 거의 없음
  3. 상위 클래스에서 재정의한 equals 가 하위 클래스에도 딱 들어맞을 때

    1. ex) Set은 AbstractSet이 구현한 equals를 상속, List는 AbstractList, Map은 AbstractMap

    2. AbstractSet 예시

      스크린샷 2024-09-15 오후 5.15.49.png

  4. 클래스가 private이나 package-private이고 equals를 호출할 일이 없을 때

    1. equals가 실수로라도 호출되는 걸 막는 법

      @Override 
      public boolean equals(Object o) {
      	throw new AssertionError(); // 호출 금지!
      }
      

equals 메서드 재정의 해야하는 경우

equals 메서드 재정의 시 고려해야할 것 : 동치관계

반사성(reflexivity)

대칭성(symmetry)