본문 바로가기
독서이야기/이펙티브 자바 3 edition

[아이템10] equals는 일반 규약을 지켜 재정의하라

by 사랑꾼이야 2022. 9. 18.
반응형

이 내용은 이펙티브 자바 Effective Java 3/E 를 읽으면서 정리한 내용을 포함하고 있습니다.

equals 메소드는 재정의하기 쉬워 보이지만 잘못 수정하게 된다면 자칫하면 끔직한 결과를 초래할 수 있습니다.

재정의

다음에 열거한 상황 중 하나에 해당된다면 재정의하지 않는 것이 최선입니다.

  • 각 인스턴스가 본질적으로 고유하다
  • 인스턴스의 논리적 동치성 을 검사할 일이 없다
  • 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다.
  • 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다

그럼, 재정의해야 할 때는 언제일까요?

  • 객체 식별성이 아니라 논리적 동치성을 확인해야 하는데, 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의되지 않았을 때입니다. 주로 값 클래스가 해당됩니다. Integer와 String처럼 값을 표현하는 클래스를 말합니다.
  • 두 값 객체를 equals로 비교하는 프로그래머는 객체가 같은지가 아니라 값이 같은지를 알고 싶어하기 때문에, equals가 논리적 동치성을 확인하도록 재정의해야 합니다.

Object 명세

equals 메서드는 동치관계를 구현하며, 다음을 만족합니다.

  • 반사성
  • 대칭성
  • 추이성
  • 일관성
  • null-아님

equals 규약을 어기면 그 객체를 사용하는 다른 객체들이 어떻게 반응할지 알 수 없습니다.

주의사항

  • equals를 재정의할 땐 hashCode도 반드시 재정의하자
  • 너무 복잡하게 해결하려 들지 말자
    • 필드들의 동치성만 검사해도 equals 규약을 어렵지 않게 지킬 수 있습니다.
  • Object 외의 타입을 매개변수로 받는 equals 메소드는 선언하지 말자

사용방법

사람이 직접 작성하는 것보다는 IDE 또는 제공해주는 라이브러리를 사용하는 것이 좋습니다. 직접 수정하다가 부주의할 실수를 저지르지는 않으니 말입니다.

  • IDE를 활용한 equals 생성
  • 롬북 어노테이션을 활용한 생성

정리

  • 꼭 필요한 경우가 아니면 equals를 재정의 하지 말아야 합니다.
  • 많은 경우에 Object의 equals가 비교를 정확히 수행해줍니다.
  • 재정의해야 할 때는 그 클래스의 핵심 필드 모두를 빠짐없이, 다섯 가지 규약을 확실히 지켜가며 비교해야 합니다.
  • 재정의 해야 한다면 IDE 또는 롬북 을 통하여 진행합니다.
반응형

댓글