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

+ Recent posts