[이펙티브 자바] equals는 일반 규약을 지켜 재정의할 것

Dev. 로티·2022년 1월 27일
0

자바

목록 보기
7/9
post-thumbnail

equals 메소드는 단순히 재정의 하기 쉬워보이지만, 자칫 잘못 재정의 할 경우 엄청난 버그를 야기할 수 있는데, 만약 equals 메소드를 재정의하지 않을 경우 같은 클래스의 경우만 true 값을 반환하게 됩니다.

아래와 같은 상황이라면 굳이 equals 메소드를 재정의 할 필요가 없습니다.

  • 값을 표현하는 객체가 아닌 행위를 표현하는 객체(service, controller …). Object.equals는 애초에 이러한 객체들에게 맞도록 설계되었다.
  • 객체의 논리적인 동치성을 검사할 필요가 없을 경우
  • 상의 클래스에서 재정의한 equals 메소드가 하위 클래스에서도 알맞게 사용할 수 있을 경우
  • 해당 객체가 싱글톤 클래스임이 보장되어 있는 경우
  • Enum 클래스의 경우

그렇다면 언제 우리는 equals 메소드를 재정의해야할까요?

바로 객체가 물리적으로 같은 객체인지를 확인하는 것이 아닌 논리적으로 같은 객체인지를 확인할 때 equals를 재정의해 사용해야합니다.

여기서 말하는 물리적으로 같은 객체라는 것은 메모리상 같은 객체를 의미하고, 논리적으로 같은 객체가 의미하는 것은 실질적으로 객체 내의 값이 같은가를 의미합니다.

결론적으로 우리는 주로 값 객체(Domain 객체)의 equals 메소드를 재정의하여 사용합니다.

우리는 값 객체의 equals 메소드를 재정의하기 위해 아래와 같은 규약을 준수해야만 합니다.

  • 반사성 : null이 아닌 참조 값 x에 대해 x.equals(x) 는 true이다.
  • 대칭성 : null이 아닌 참조값 x, y에 대해 x.equals(y) 가 true면 y.equals(x) 또한 true이다.
  • 추이성 : null이 아닌 참조값 x, y, z 에 대하여 x.equals(y)가 true이고 x.equals(z)가 true면 z.equals(y) 또한 true이다.
  • 일관성 : null이 아닌 참조값 x, y에 대해 x.equals(y)가 true라면 반복적으로 호출하더라도 항상 true가 나와야한다.
  • null 값을 비교할 경우 항상 false를 반환한다.

0개의 댓글