학습 방식.
- 일단 떠오르는 걸 적기.
- 내용 중에서 핵심을 1문장씩 정리.(내용을 다 옮겨 적지 말것. 키워드 위주. 키워드만 표시 해도 무난. 세상엔 많은 블로그 자료가 있음.
- 오히려 밑줄 친것들 의문 들었던 것들을 집중 파헤치기.
아이템 10 equals는 일반 규약을 지켜 재정의 하라
- 일반 규칙을 잘 지켜볼것.
- equals는 아래를 만족해야함.(반사, 대칭, 추이, 일관, null)
- 추이성.
- x →y, y→z 면 x→z
- Point class, ColorPointClass
- 구체 클래스를 확장해 새로운 값을 추가하면서 equals 규약을 만족시킬 방법은 존재하지 않는다.
- 그런 예시. TimeStamp. date랑 섞어 쓸때 조심.
- null 비교시
아이템 11 equals를 재정의하려거든 hashcode도 재정의하라
- 당연한 이야기.
- equals로 같으면 hashcode 도 같은 값.
- 핵심필드를 반드시 포함하여 계산.
- 양이 많으면 요약 정보를 반환.
아이템 12 toString을 항상 재정의하라
- 항상은 아니고, 기존에 있던 toString이 탐탁치 않으면 진행
- toString 은 디버깅을 쉽게함.
- 포맷을 명시하는 것도 때로는 방법
아이템 13 clone 재정의는 주의해서 진행하라
- clone 재정의 하지 말고, 생성자랑 팩터리 매서드를 써라.
- Array는 예외. 이것 클론이 나음.
- 모순적 매커니즘 생성자를 호출하지 않고 객체 생성이 가능하게됨.
- clone
- 원본 객체에 해를 끼치지 않음 && 복제된 객체의 불변식을 보장.
- 유의 사항
- HashTable같이 내부에서 사용하는 배열이 주소를 담은(객체를 담은 Entry[]) 형태라면, 단순한 clone은 배열내부의 주소값은 그대로 사용하는 이슈가 있다.
- 배열내부를 하나씩 순회하며 deepcopy를 해야함.
- 복사 생성자!, 복사 팩터리 방식을 이용하자.
- 더 적절한 표현 conversion constructor, conversion factory
아이템 14 Comparable을 구현할지 고려하라
- ~ing
- Comparable vs Comparator
- 동치성비교 플러스 순서까지 비교.
- 이것이 구현되면 손쉽게 정렬 가능.
- 몇 가지 규약이 있음.
- 특징
- 객체 참조 필드를 비교하려면 compareTo 메서드를 재귀적으로 호출한다.
- Comparable를 구현하지 않은 필드나 표준이 아닌 순서로 비교해야하면 비교자( Comparator) 를 사용할것.
- 비교자를 직접 만들수도.
- 자바에서 제공하는 것을 쓰든.
- 91pg 참고할것.
- 7이후 부터 < 나 > 말고, 박싱된 기본타입에서 제공하는 compare를 사용하자.
- PhoneNumber 와 같은 복합 필드를 갖는 것.
- 박싱된 기본 타입 클래스가 제공하는 정적 compare 메서드
- 이거는 오토 박싱으로 인한 생성저하나 메모리 문제가 없는가?
참고 자료.
https://sjh836.tistory.com/169
[EFFECTIVE JAVA] 이펙티브 자바 독서스터디 - 3장 모든 객체의 공통 메서드
https://twinparadox.tistory.com/640