ReadingBooks

[Effective Java] 모든 객체의 공통 메서드

주정용 2021. 7. 30. 08:48
728x90

equals는 일반 규약을 지켜 재정의하기

  • equals를 overriding하지 않는 경우
    • 각 인스턴스가 본질적으로 고유함
    • 인스턴스의 논리적 동치성 검사 불필요
    • 상위 클래스의 equals가 하위 클래스에도 잘 맞음
    • 클래스가 private이거나, package-private이어서 equals 호출 안함
  • equals를 overriding해야 하는 경우
    • 논리적 동치성을 확인해야 하는 경우
  • equals 동치관계 구현 조건
    • 반사성 : 객체는 자기 자신과 같아야 함
    • 대칭성 : 두 객체는 서로에 대한 동치 여부에 동일한 답을 해야 함
    • 추이성 : 첫번째 == 두번째 == 세번째
    • 일관성 : 두 객체가 같다면 영원히 같아야 함
    • Non-null : 모든 객체가 null과 같지 않아야 함
  • equals 구현 방법
    • ==로 입력이 자기 자신의 참조인지 확인
    • instaneof로 입력이 올바른 타입인지 확인
    • 입력을 올바른 타입으로 casting
    • 핵심 필드들이 모두 일치하는지 하나씩 검사
  • equals를 overriding할 때 hashCode도 반드시 overriding
  • Object 외의 타입을 매개변수로 받는 equals는 선언하지 않기

equals를 재정의하면 hashCode도 재정의하기

  • equals를 overriding한 클래스는 hashCode도 overriding 해야 함
    • 논리적으로 같은 객체는 같은 해시코드를 반환해야 함
  • 성능을 높이기 위해서 hashCode 구하는 데 핵심 필드를 생략하면 안됨

toString을 항상 재정의하기

  • toString은 간결하면서 사림이 읽기 쉬운 형태로 유익한 정보를 반환해야 함
  • toString을 잘 구현하면 디버깅이 쉬워짐
  • toString은 객체가 가진 주요 정보를 모두 반환해야 함

clone 재정의는 주의하기

  • cloneable을 구현한 클래스의 인스턴스는 clone을 호출하면 필드를 모두 복사한 객체를 반환함
  • cloneable을 구현하지 않은 클래스에서 호출하면 CloneNotSupportedException
  • clone은 생성자와 같은 효과를 냄
    • 원본 객체에 영향을 주지 않고, 복제된 객체의 불변식을 보장해야 함
  • cloneable은 가변 객체를 참조하는 필드는 final로 선언하라는 일반 규칙과 충돌함
  • public인 clone 메서드에서는 throw 절을 제거해야 함
    • 그래야 사용하기 편함
  • cloneable을 구현하지 않은 클래스를 확장할 때에는 복사 생성자복사 팩터리가 더 나은 방법

Comparable을 구현할지 고려하기

  • Comparable을 구현한 것은 인스턴스에 자연적인 순서가 있다는 의미
  • Wrapper 클래스에서는 <, >보다는 compare 메서드를 추천

참고자료

이펙티브 자바 3/E

'ReadingBooks' 카테고리의 다른 글

[Effective Java] 객체 생성과 파괴  (0) 2021.07.27