-
item 14 Comparable을 구현할지 고려하라책/이펙티브 자바 2022. 2. 28. 22:08
Item 14. Comparable을 구현할지 고려하라
Comparable 인터페이스의 compareTo는 두가지만 제외하면 equals와 같다
- compareTo는 단순 동치성 비교에 더해 순서까지 비교 가능하며 제네릭하다
- Comparable을 구현한 객체들의 배열은 손쉽게 정렬이 가능하다
- Comparable을 구현 했다는것은 해당 클래스의 인스턴스에게 자연적인 순서가 존재 한다는 것
- 검색, 극단값 계산, 자동 정렬되는 컬렉션 관리도 쉽게 가능
- 알파벳 숫자 연대 같이 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable을 구현하자
compareTo 메서드의 일반 규약은 equals의 규약과 비슷하다
- 이 객체와 주어진 객체의 순서를 비교한다
- 이 객체가 주어진 객체보다 작으면 음의 정수를, 같으면 0을 크면 양의 정수를 반환한다
- 이 객체와 비교할 수 없는 타입의 객체가 주어지면 ClassCastException을 던진다
- compareTo는 타입이 다른 객체를 신경쓰지 않아도 된다
- equals 메서드는 모든 객체에 대해 전역 동치관계를 부여한다
compareTo 규약
- Comparable을 구현한 클래스는 모든 x,y에 대해 sgn(x.compareTo(y)) == -sgn(y.compareTo(x))여야 한다 (따라서 x.compareTo(y)는 y.compareTo(x)가 예외를 던질때에 한해 예외를 던져야 한다)
- 두 객체 참조의 순서를 바꿔 비교해도 예상한 결과가 나와야 한다
- 첫번째 객체가 두번째 객체보다 작으면 두번째가 첫번째 보다 커야한다
- 두 객체 참조의 순서를 바꿔 비교해도 예상한 결과가 나와야 한다
- Comparable을 구현한 클래스는 추이성을 보장해야 한다. 즉, (x.compareTo(y) > 0 && y.compareTo(z) > 0 이면 x.compareTo(z) > 0이다
- 첫번째가 두번째보다 크고 두번째가 세번째보다 크면 첫번째는 세번째보다 커야한다
- Comparable을 구현한 클래스는 모든 z에 대해 x.compareTo(y) == 0이면 sgn(x.compareTo(z)) == sgn(y.compareTo(z))다
- 크기가 같은 객체들끼리는 어떤 객체와 비교해도 항상 같아야 한다
- 이번 권고가 필수는 아니지만 꼭 지키는게 좋다
- (x.compareTo(y) == 0) == (x.equals(y))여야 한다.
- Comparable을 구현하고 이 권고를 지키지 않는 모든 클래스는 그 사실을 명시해야 한다
- 주의: 이 클래스의 순서는 equals 메서드와 일관되지 않다
정리
- 순서를 고려해야 하는 값 클래스라면 꼭 Comparable 인터페이스를 구현하자
- compareTo 메서드에서 필드의 값을 비교할 때 < 와 > 연산자는 쓰지 말자
- 예전 방식으로 거추장스럽고 오류를 유발한다
- 박싱된 기본 타입 클래스가 제공하는 정적 compare 메서드나 Comparator 인터페이스가 제공하는 비교자 생성 메서드를 사용하자**
'책 > 이펙티브 자바' 카테고리의 다른 글
item 16 public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) 2022.03.02 item 15 클래스와 멤버의 접근 권한을 최소화하라 (0) 2022.03.01 item 13 clone 재정의는 주의하여 진행하라 (0) 2022.02.25 item 12 toString을 항상 재정의하라 (0) 2022.02.24 item 11 equals를 재정의하려거든 hashCode도 재정의하라 (0) 2022.02.23