본문은 Effective Java를 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
선결론
- 순서를 고려해야 하는 값 클래스를 작성한다면 꼭 Comparable 인터페이스를 구현하자
- compareTo 메서드에서 필드의 값을 비교할 때 부등호 연산자(<,>)는 사용하면 안된다
- 대신 Wrapper 클래스가 제공하는 static compare 메서드나 Comparator 인터페이스가 제공하는 비교자 생성 메서드를 사용하자
compareTo의 일반 규약
두 가지 차이를 빼고 compareTo는 기본적으로 equals와 비슷하다.
- compareTo는 동치성 비교 뿐만 아니라 순서까지 비교할 수 있다
- 또한, 제네릭하기 때문에 형변환에 대한 부담이 없다
따라서 compareTo 메서드의 일반 규약은 equals의 규약과 비슷하다 - 아이템10
즉, 반사성/대칭성/추이성을 지켜야 한다
- x.compareTo(y) == -(y.compareTo(x))이다 → 반사성
- x.compareTo(y) > 0이면서 y.compareTo(z) > 0 이면 x.compareTo(z) > 0이다 → 추이성
- x.compareTo(y) == 0이면 x.compareTo(z) == y.compareTo(z)이다 → 대칭성
- (x.compareTo(y) == 0) == (x.equals(y))여야 한다
- 이 항목은 필수는 아니지만 꼭 지키는 게 좋다
- 정렬된 컬렉션에서 동치성을 비교할 때 equals 대신 compareTo를 사용하기 때문에 안 지키면 이상하게 동작할 수 있음
compareTo 작성 요령
- 객체 참조 필드를 비교하기 위해선 compareTo 메서드를 재귀적으로 호출하거나 Compartor를 대신 사용하라
- 기본 타입 필드를 이용할 때는 Wrapper 클래스가 제공하는 static compare 메서드를 사용하라
- 비교자 생성 메서드를 사용하라 - Guide to Java 8 Comparator.comparing()
- 값의 차를 이용하는 방식을 사용하지마라!! 오버플로, 부동소수점 계산 방식에 따른 오류를 발생시킬 수 있다..
- 대신 위에서 말한 static compare 메서드나 비교자 생성 메서드를 사용하라
'책 > Effective Java' 카테고리의 다른 글
[이펙티브 자바] 아이템 16: public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) | 2022.05.02 |
---|---|
[이펙티브 자바] 아이템15: 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2022.04.28 |
[이펙티브 자바] 아이템13: clone 재정의는 주의해서 진행하라 (0) | 2022.04.27 |
[이펙티브 자바] 아이템12: ToString을 항상 재정의하라 (0) | 2022.04.26 |
[이펙티브 자바] 아이템11: equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2022.04.22 |