public interface Comparable<T> {
public int compareTo(T t);
}
Arrays.sort(a)
로 손쉽게 정렬할 수 있음⇒ 알파벳, 숫자 같이 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하자!
<aside> 🏷️
두 객체 참조의 순서를 바꿔 비교해도 예상한 결과가 나와야 함
추이성을 보장해야 한다.
크기가 같은 객체들끼리는 어떤 객체와 비교하더라도 항상 같아야 함
(x.compareTo(y)==0) == (x.equals(y)) 를 만족하는 것이 좋음
→ (일부) Set이나 Map 메서드의 동치성 확인은 equals()가 아닌 compreTo() 메서드가 수행하기 때문!
ex) BigDecimal : HashSet 사용 시 equals로 비교하여 원소를 2개 갖게됨. TreeSet 사용 시 compareTo로 비교해 원소를 1개 갖게됨
equals()와 마찬가지로 기존 클래스를 확장한 구체 클래스에서 새로운 값 컴포넌트를 추가했다면 compareTo 규약을 지킬 방법이 사라짐 → 상속 대신 컴포지션 사용하여 우회하자
compareTo의 인수 타입은 컴파일 타입에 결정되므로(Comparable 제네릭) 입력 인수의 타입을 확인하거나 형변환할 필요가 없음 → 컴파일 할 때 잘못된 것을 알 수 있으므로
null을 인수로 넣어 호출하면 NullPointerException을 던져야 함
compareTo 메서드는 각 필드가 동치인지를 비교하는 게 아니라 그 순서를 비교함
비교자 사용 시 관계 연산자(>,<) 보다는 박싱된 기본 타입 클래스들에 새로 추가된 정적 메서드 compare를 사용하자
class MyObject implements Comparable<MyObject> {
private int a;
private double b;
@Override
public int compareTo(final MyObject o) {
if (a == o.a) {
return Double.compare(b, o.b);
}
return Integer.compare(a, o.a);
}
}
클래스에 핵심 필드가 여러 개인 경우 가장 핵심 필드부터 비교하자