effective java 3장 모든 객체의 공통 매서드

bluesky·2023년 11월 23일

학습 방식.

  • 일단 떠오르는 걸 적기.
  • 내용 중에서 핵심을 1문장씩 정리.(내용을 다 옮겨 적지 말것. 키워드 위주. 키워드만 표시 해도 무난. 세상엔 많은 블로그 자료가 있음.
  • 오히려 밑줄 친것들 의문 들었던 것들을 집중 파헤치기.

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

  • 일반 규칙을 잘 지켜볼것.
  • equals는 아래를 만족해야함.(반사, 대칭, 추이, 일관, null)
    • 추이성.
      • x →y, y→z 면 x→z
      • Point class, ColorPointClass
        • 구체 클래스를 확장해 새로운 값을 추가하면서 equals 규약을 만족시킬 방법은 존재하지 않는다.
          • 그런 예시. TimeStamp. date랑 섞어 쓸때 조심.
      • null 비교시
        • Objects.equals NP 예

아이템 11 equals를 재정의하려거든 hashcode도 재정의하라

  • 당연한 이야기.
  • equals로 같으면 hashcode 도 같은 값.
  • 핵심필드를 반드시 포함하여 계산.
  • 양이 많으면 요약 정보를 반환.

아이템 12 toString을 항상 재정의하라

  • 항상은 아니고, 기존에 있던 toString이 탐탁치 않으면 진행
  • toString 은 디버깅을 쉽게함.
  • 포맷을 명시하는 것도 때로는 방법
    • ex) 전화번호부.
    • 명확하고, 읽기

아이템 13 clone 재정의는 주의해서 진행하라

  • clone 재정의 하지 말고, 생성자랑 팩터리 매서드를 써라.
  • Array는 예외. 이것 클론이 나음.
  • 모순적 매커니즘 생성자를 호출하지 않고 객체 생성이 가능하게됨.
  • clone
    • 원본 객체에 해를 끼치지 않음 && 복제된 객체의 불변식을 보장.
  • 유의 사항
    • HashTable같이 내부에서 사용하는 배열이 주소를 담은(객체를 담은 Entry[]) 형태라면, 단순한 clone은 배열내부의 주소값은 그대로 사용하는 이슈가 있다.
      • 배열내부를 하나씩 순회하며 deepcopy를 해야함.
  • 복사 생성자!, 복사 팩터리 방식을 이용하자.
    • 더 적절한 표현 conversion constructor, conversion factory

아이템 14 Comparable을 구현할지 고려하라

  • ~ing
  • Comparable vs Comparator
  • 동치성비교 플러스 순서까지 비교.
  • 이것이 구현되면 손쉽게 정렬 가능.
  • 몇 가지 규약이 있음.
    • equals와 유사.
  • 특징
    • 객체 참조 필드를 비교하려면 compareTo 메서드를 재귀적으로 호출한다.
    • Comparable를 구현하지 않은 필드나 표준이 아닌 순서로 비교해야하면 비교자( Comparator) 를 사용할것.
      • 비교자를 직접 만들수도.
      • 자바에서 제공하는 것을 쓰든.
  • 91pg 참고할것.
    • 7이후 부터 < 나 > 말고, 박싱된 기본타입에서 제공하는 compare를 사용하자.
  • PhoneNumber 와 같은 복합 필드를 갖는 것.
    • 비교자 생성 메서드를 활용하면 좋음.
      • 수행 속도 빠름. 간결함.

      • 자바의 정적 임포트 기능을 사용.

        private static final Comparator<PhoneNumber> COMPARATOR =
                comparingInt((PhoneNumber pn) -> pn.areaCode)
                    .thenComparingInt(pn -> pn.prefix)
                    .thenComparingInt(pn -> pn.lineNum);
        
        public int compareTo(PhoneNumber pn) {
            return COMPARATOR.compare(this, pn);
        }
  • 박싱된 기본 타입 클래스가 제공하는 정적 compare 메서드
    • 이거는 오토 박싱으로 인한 생성저하나 메모리 문제가 없는가?

참고 자료.

https://sjh836.tistory.com/169

[EFFECTIVE JAVA] 이펙티브 자바 독서스터디 - 3장 모든 객체의 공통 메서드

https://twinparadox.tistory.com/640

profile
SMART https://github.com/dongseoki?tab=repositories

0개의 댓글