참조: Effecive Java 2nd Edition. Item 12: Consider implementing Comparable

compareTo는 Comparable 인터페이스가 제공한다. Object의 equals와 비슷하지만, 순서 비교가 가능하며, 동일성 여부도 알 수 있고 generic하다.(어떤 의미에서 generic 하다는 거지?) 이 인터페이스를 구현한 클래스는 정렬이 가능한 것으로 인식한다. 따라서 이 클래스 타입의 배열을 다음과 같이 정렬할 수 있다.

Arrays.sort(a);

String은 Comparable 인터페이스 구현했다. 알파벳 순으로 정렬 쉽게 할 수 있다.

public interface Comparable<T> {
  int compareTo(T t);
}

Generic 사용해서 타입 제한 할 수 있다.

제약사항
- 넘어온 객체보다 작을 떄는 음수 반환, 같으면 0 반환, 크면 양수 반환.
- 음수일 땐 -1, 같을 땐 0, 양수일 땐 1을 반환하는 함수 sgn(expression)이 있을 때
  -  sgn(x.compareTo(y)) == -sgn(y.compare-To(x))
  - (x.compareTo(y) > 0 && y.compareTo(z) > 0)이면, x.compareTo(z) > 0
  - x.compareTo(y) == 0 이때, sgn(x.compareTo(z)) == sgn(y.compareTo(z))
 - 권고 사항: equals 비교 했을 때 같은 객체끼리는 compareTo 결과가 0이어야 한다.

구현하기
- equals와 비슷하지만 타입 확인할 필요 없다.
- 캐스팅도 필요없다.
- null 일 떈, NullPointerException 던진다.
- 각각의 필드를 비교한다.

샘플

public int compareTo(PhoneNumber pn) {
  // Compare area codes
  if (areaCode < pn.areaCode)
    return -1;
  if (areaCode > pn.areaCode)
    return  1;
  ...

}