[이펙티브자바] 3장 모든 객체의 공통 메서드(item10-14) 정리
아이템 10. equals는 일반 규약을 지켜 재정의하라
- 논리적 동치성을 검사할 필요가 있는 경우엔 equals메서드를 규약에 따라 재정의하자
꼭 필요한 경우가 아니라면 재정의 X
- 구체 클래스를 확장해 새로운 값을 추가하면서 equals 규약을 만족시킬 수 없다.
상속 대신 컴포지션을 사용하자
- equals의 판단에 신뢰할 수 없는 자원이 끼어들면 안된다.
항시 메모리에 존재하는 객체만을 사용
- 필드 비교의 순서가 equals의 성능을 좌우하기도 한다.
비교 비용이 더 싼 필드 먼저 비교하기
객체의 논리적 상태와 관련 없는 필드 비교 X
- equals를 직접 구현했다면 반드시 단위 테스트를 하자
대칭성, 추이성, 일관성
- 입력 타입이 Object가 아니라면 재정의가 아닌, 다중정의 !
- 친절한 킹텔리제이
아이템 11. equals를 재정의하려거든 hashCode도 재정의하라
- equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다.
논리적으로 같은 객체는 같은 해시코드를 반환해야 함
서로 다른 인스턴스에 대해선 다른 해시코드를 반환해야 함
- hashCode메서드 구현 시, equals 비교에 사용되지 않은 필드는 반드시 제외해야 한다.
파생필드도 제외해도 됨
- Objects 에서 제공하는 hash메서드는 느리다. 성능에 민감하지 않을 때 사용하자.
- 클래스 불변, 해시코드 계산 비용 크다면 → 캐싱하는 방식을 고려해야 한다.
- 프레임워크, IDE에서 멋진 equals, hashCode 만들어준다.
아이템 12. toString 을 항상 재정의하라
- 모든 하위 클래스에서 toString을 재정의하라.
간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 함
주요 정보는 모두 반환하는 것이 좋음
- toString 메서드는 직접 호출하지 않아도 어디선가 불릴 수 있다.
그러니까 유익한 정보를 반환하도록 재정의하라
- 재정의가 필요하지 않은 경우도 있다.
정적 유틸리티 클래스, enum Type
- 프레임워크, IDE에서 생성해주긴 하지만, 필요하다면 직접 재정의하자.
아이템 13. clone 재정의는 주의해서 진행해라
- 복제 기능은 생성자와 팩터리를 이용하는 게 최고다.
- Cloneable을 구현한 clone을 재정의해서 사용하려면 신경쓸 부분이 많은데, 복사 생성자 / 팩터리 사용하면 해결된다.
- 복사 생성자가 구현하기 훨씬 간편하다.
복사 생성자의 장점
1. Cloneable interface 를 구현안해도 된다.
2. CloneNotSupportedException 을 핸들링 안해도 된다
3. clone 은 Object 를 리턴하므로, typecast 해야된다
4. final 필드를 set 할 수 있다.
- Checked / unchecked exception
https://cheese10yun.github.io/checked-exception/
아이템 14. Comparable을 구현할지 고려하라
- 순서가 명확한 클래스를 작성한다면 반드시 Comparable을 구현하여 손쉽게 컬렉션을 정렬하자.
- compareTo도 equals처럼 일반 규약을 지켜서 재정의해야 한다.
- 타입이 다른 객체가 오면 ClassCastException을 발생시키면 된다.
- Comparable은 제네릭 인터페이스이기 때문에 equals에서 했던 type 확인, casting이 필요없다.
- null을 인자로 받는다면 NullPointerException을 발생시키면 된다.
- compareTo를 이용하여 정수 타입을 비교 할 때 관계연산자를 쓰지 말고 정적메서드인 compare를 사용하자
- 자바8부터는 Comparator 인터페이스로 메서드 연쇄 방식으로 비교자를 생성할 수 있다. (하지만 약간 성능저하)