티스토리 뷰

equals 메서드는 재정의하기 쉬워 보이지만 실수할 여지도 많다. 이런 문제를 피하는 가장 간단한 방법은 equals 메서드를 재정의 하지 않는 것이다.

 

아래 조건 중 하나라도 만족하면 equals 메서드를 재정의 하지 않아도 된다.

  1. 각각의 객체가 고유한 경우
  2. 상위 클래스에서 재정의한 equals가 하위 클래스에서 사용하기에도 적당 한 경우

그렇다면 Object.equals를 재정의하는 것이 바람직할 때는 언제인가?

  1. 객체 동일성(Object equality)이 아닌 논리적 동일성(Logical equality)의 개념을 지원하는 클래스인 경우
  2. 상위 클래스의 equals가 하위 클래스의 필요를 충족하지 못하는 경우

값 클래스(Value Class)는 대체로 그 조건에 부합한다. Value Class (Integer. Date 등)는 단순히 어떤 값을 표현하는 클래스이다. 이런 경우 두 객체가 같은 값을 확인하기 위해 equals를 사용하지 같은 객체인지 확인하려고 equals를 사용하지 않는다. Map이나 Set의 요소로 사용될 경우 equals 메서드의 오버라이딩이 꼭 필요하다. 같은 값의 객체가 이미 있는지 비교하는 수단으로 제공되어야 하기 때문이다.

 

 

equals 메서드 재정의 일반 규약 (general contract)


동치관계

  1. 반사성 : 모든 객체가 자기 자신과 같아야 한다. null이 아닌 참조 x가 있을 때 x.equals(x)는 true를 반환한다.
  2. 대칭성 : 두 객체에 서로 같은지 물으면 같은 답이 나와야 한다. null이 아닌 참조 x, y가 있을 때 x.equals(y)가 true 이면 y.equals(x)는 true를 반환한다.
  3. 추이성 : 첫 번째 객체가 두 번째 객체와 같고, 두 번째 객체가 세 번째 객체와 같다면 첫 번째와 세 번째 객체도 같아야 한다. null이 아닌 참조 x, y, z가 있을 때 x.equals(y)가 true이고 y.equals(z)가 true 이면 x.equals(z)도 true이다.
  4. 일관성 : 같다고 판정된 객체들은 추후 변경되지 않는 한 계속 같아야 한다. null이 아닌 참조 x, y가 있을 때 값의 변화가 없는 경우 x.equals(y) true 이면 횟수에 상관없이 항상 true이다.

 

equals 메서드 재정의 일반 규약을 종합해 보면 다음과 같은 지침을 얻을 수 있다.

  1. == 연산자를 사용하여 equals의 인자가 자기 자신인지 검사하라
  2. instanceof 연산자를 사용하여 인자의 자료형이 정확한지 검사하라.
  3. equals의 인자를 정확한 자료형으로 반환하라.
  4. '중요' 필드 각각이 인자로 주어진 객체의 해당 필드와 일치하는지 검사하라.
  5. equals를 구현할 때는 hashCode도 재정의하라.
  6. equals 메서드 인자형을 Object에서 다른 것으로 바꾸지 마라. (equals 메서드에 @Override 키워드를 일관되게 사용하면 이런 실수를 피할 수 있다.)
  7. equals 메서드 구현을 끝냈다면 대칭성, 추이성, 일관성의 세 속성이 만족되는지 검토하라.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함