(Effective Java 2/E) 114. Item 12 - Consider implementing Comparable

Consider implementing Comparable

  • 2판 제목 : Comparable 구현을 고려하라
  • 3판 제목 : Comparable을 구현할지 고려하라

compareTo 메서드는 지금까지 다루었던 함수들과 달리 Object에 선언된 메서드는 아니다.

compareTo 메서드는 아래처럼 Comparable 인터페이스에 선언된 메서드로 equals와 비슷하지만 단순 동치성 검증 이외에도 순서 비교가 가능하며 좀 더 일반적인 특징이 있다.

1
2
3
public interface Comparable<T> {
public int compareTo(T o);
}

Comparable 인터페이스를 구현한 클래스의 인스턴스에는 자연적인 순서가 있음을 뜻하며, Comparable을 구현한 객체들의 배열은 다음과 같이 쉽게 정렬할 수 있다.

1
Arrays.sort(a);

마찬가지로 Comparable 인터페이스를 구현한 클래스는 순회하며 특정 값을 찾거나, 최대값, 최소값등을 계산하는 데도 쓰인다.

아래 예제는 StringComparable을 구현하고 있음을 확인할 수 있는 예제로, 알파벳 순서로 정렬함과 동시에 중복을 제거하고 있다.

1
2
3
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
// ...
}
1
2
3
4
5
public static void main(String[] args) {
Set<String> s = new TreeSet<String>();
Collections.addAll(s, args);
System.out.println(s);
}

사실상 모든 값 클래스와 열거형 타입이 Comparable을 구현하고 있으며, 순서가 명확한 값 클래스를 작성하는 경우 인터페이스를 구현하는 것이 좋다.