[Java] Effective Java 정리 - (Item 10 ~ Item 14)

황시준·2023년 8월 6일

10. equals는 일반 규약을 지켜 재정의하라

  • 꼭 필요한 경우가 아니면 equals를 재정의하지 않는게 좋다.
  • 많은 경우에 Object의 equals가 우리가 원하는 비교를 정확히 수행한다.
  • 재정의해야할 때는 그 클래스의 핵심 필드 모두를 빠짐없이, 다섯 가지 규약을 확실히 지켜가며 비교해야 한다.

11. equals를 재정의하려거든 hashCode도 재정의하라.

  • equals를 재정의할 때는 hashCode도 반드시 재정의해야 한다.
    그렇지 않으면 프로그램이 제대로 동작하지 않을 것이다.
  • 재정의한 hashCode는 Object의 API 문서에 기술된 일반 규약을 따라야 하며,
    서로 다른 인스턴스라면 되도록 해시코드도 서로 다르게 구현해야 한다.
  • 이런 구현 방식이 귀찮다면, AutoValue 프레임워크를 사용하면
    멋진 equals와 hashCode를 자동으로 만들어준다. IDE들도 이런 기능을 일부 제공한다.

12. toString을 항상 재정의하라

  • 모든 구체 클래스에서 Object의 toString을 재정의하자.
  • 상위 클래스에서 이미 알맞게 재정의한 경우는 예외
  • toString을 재정의한 클래스는 사용하기도 좋고 그 클래스를 사용한 시스템을 디버깅하기 쉽게 해준다.
  • toString은 해당 객체에 관한 명확하고 유용한 정보를 읽기 좋은 형태로 반환해야 한다.

13. clone 재정의는 주의해서 진행하라

  • 새로운 인터페이스를 만들 때는 절대 Clonable을 활장해서는 안되며, 새로운 클래스도 이를 구현해서는 안됀다.
  • final 클래스라면 Clonable을 구현해도 위험이 크진 않지만, 성능 최적화 관점에서 검토한 후 별다른 문제가 없을 때만 드물게 허용해야 한다.
  • 기본 원칙은 '복제 기능은 생성자와 팩토리를 이용하는게 최고' 이다.
  • 단 배열만은 clone메서드 방식이 가장 깔끔한 합당한 예외라 할 수 있다.

14. Comparable을 구현할지 고려하라

  • 순서를 고려해야 하는 값 클래스를 작성한다면 꼭 Comparable 인터페이스를 구현하여, 그 인스턴스들을 쉽게 정렬하고, 검색하고, 비교 기능을 제공하는 컬렉션과 아우러지도록 해야 한다.
  • compareTo 메서드에서 필드의 값을 비교할 때 <와 > 연산자는 쓰지 말아야 한다.
  • 대신 박싱된 기본 타입 클래스가 제공하는 정적 compare 메서드나 Comparator 인터페이스가 젲공하는 비교자 생성 메서드를 사용하자.
profile
하고싶은게 많은 newbie

0개의 댓글