Chapter3 모든 객체의 공통 메서드
1. equals는 일반 규약을 지켜 재정의하라
<일반 규약>
- 반사성(reflexitivy) : null이 아닌 모든 참조값 x에 대해,
x.equals(x)
는 true이다. - 대칭성(symmetry) : null이 아닌 모든 참조값 x, y에 대해,
x.equals(y)
가 true이면y.equals(x)
도 true이다. - 추이성(transitivity) : null이 아닌 모든 참조값 x, y, z에 대해,
x.equals(y)
가 true이고,y.equals(z)
가 true이면,x.equals(z)
가 true이다. - 일관성(consistency) : null이 아닌 모든 참조값 x, y에 대해,
x.equals(y)
를 반복해서 호출하면 항상 true를 반환하거나 항상 false를 반환해야 한다. - null이 아닐 경우 : null이 아닌 모든 참조값 x에 대해,
x.equals(null)
은 false이다.
<정의 방법>
- == 연산자를 사용하여 입력이 자기 자신의 참조인지 확인(성능 최적화 용)
- instanceof 연산자로 입력이 올바른 타입인지 확인
- 입력을 올바른 타입으로 형변환
- 입력 객체와 자기 자신의 대응되는 '핵심' 필드들이 모두 일치하는지 확인
2. equals는 재정의하려거든 hashCode도 재정의하라
- equals가 두 객체를 같다고 판단했으면, 두 객체가 같은 hashCode를 갖는 것이 원칙.
- 따라서 equals를 재정의를 했는데 hashCode를 재정의를 안하면 다음과 같은 오류가 발생
-
Map<PhoneNumber, Name> m = new HashMap<>(); m.put(new PhoneNumber(010, 1234, 5678), "제니"); //phoneNumber(key): 010-1234-5678, name(value): 제니 저장 m.get(new PhoneNumber(010, 12345, 5678)); // null을 반환 함.
- 주로
Hash-
인 컬렉션에서 이러한 문제가 발생할 수 있음
- 주로
3. toString을 항상 재정의하라
- 실전에서 상위 클래스에서 toString을 제외한 경우를 제외하고, toString을 재정의 하는 것이 좋다.
- toString으로 객체의 주요 정보를 모두 반환하는것이 좋지만, 객체가 너무 거대하거나 표현하기 어렵다면, 요약한 내용을 반환하는 것도 좋다.
4. clone 재정의는 주의해서 진행하라
- Cloneable을 구현한 객체는
clone()
을 통해 해당 객체를 복사 할 수 있음 - 새로운 인터페이스를 만들 때는 Clonealbe을 확장해서는 안됨
- final과 Array는 가능 (단, final 클래스면 성능을 테스트 해봐야 함)
5. Comparable을 구현할지 고려하라
- 순서를 고려해야 하는 값 클래스를 작성할 때는 Comparable 인터페이스를 구현하여야 함
x.compareTo(y)
메서드는 x가 y보다 작으면 음의 정수를 같으면 0, 크면 양의 전수를 반환- 구현할 때
>
,<
를 사용하면 안됨 - 정적
compare
메서드나 comparator 인터페이스가 제공하는 비교자 생성 메서드를 사용
- 구현할 때
※ 참고
- 이펙티브 자바 - 조슈아 블로크
'BOOK > [이펙티브 자바]' 카테고리의 다른 글
[Effective Java] Chapter7 람다와 스트림 (0) | 2022.03.17 |
---|---|
[Effective Java] Chapter6 열거 타입과 애너테이션 (0) | 2022.03.15 |
[Effective Java] Chapter5 제네릭 (0) | 2022.02.15 |
[Effective Java] Chapter4 클래스와 인터페이스 (0) | 2022.02.10 |
[Effective Java] Chapter2 객체 생성과 파괴 (0) | 2022.02.03 |