equals 메서드를 재정의하지 않아도 되는 경우.

1.각각의 객체가 고유하다. 

-값 대신 활성 개체를 나타내는 Thread 같은 클래스가 이 조건에 부합한다.

2.클래스의 논리적 동일성 검사 방법이 있건 없건 상관없다. 

-Random클래스는 두 객체가 같은 난수열을 만드는지 검사하는 equals를 재정의 할 수 있었지만, 사용자의 입장에서 의미치 않은 것이라 판단하여 재정의하지 않았다.

3.상위 클래스에서 재정의한 equals가 하위 클래스에서 사용하기에도 적당하다

-대부분의 List클래스

4.클래스가 private or package-private로 선언되어있고 equals를 호출할 일이 없다.

-혹시 호출할 수도 있잖아..? 재정의하는게 나을지도..

equals 메서드를 재정의 해야할 때

1.논리적 동일성의 개념을 지원하는 클래스.

2.상위 클래스의 equals가 하위 클래스의 필요를 충족치 못할 때.

예를 들어, 값 클래스(Integer , Date같은..) 와 같은 클래스들이 적합하다.

equals 메서드는 동치 관계를 구현한다

  • 반사성 : 모든 객체는 자신과 같아야 한다.  x.equals(x) 는 true
  • 대칭성 : 두 객체에게 서로 같은지 물으면 같은 답이 나와야 한다. x.equals(y) == y.equals(x) 
  • 추이성 : x.equals(y) 가 같고, y.equals(z) 가 같으면 x.equals(z)는 같아야 한다.
  • 일관성 : x.equals(y) 가 같다고 판단되었으면, 추후 변경되지 않는 한 계속 같아야 한다.


멋진 equals 메서드를 구현하기 위한 지침.

  1.  == 연산자를 사용하여 equals의 인자가 자기 자신인지 검사하라.
  2. instanceof 연산자를 사용하여 인자의 자료형이 정확한지 검사하라.
  3. equals의 인자를 정확한 자료형으로 변환하라. 위의 instanceof를 통과하면 반드시 성공한다.
  4. 중요 필드 각각이 인자로 주어진 객체의 해당 필드와 일치하는지 검사한다.
  5. equals 메서드 구현을 끝냈다면, 대칭성, 추이성, 일관성의 세 속성이 만족하는 지 검토하라.



+ Recent posts