본문 바로가기

study/effective java

[item14] Comparable를 구현할지 고려하라

Comparable 인터페이스

이 클래스로 만들어진 객체들은 순서를 매길 수 있도록 하는 인터페이스이다.

주로 정렬에 사용되며 이외에도 검색, 극단값 계산등에도 이용할 수 있다.

Clonable과 달리 compareTo(T o) 라는 자기 자신을 가리키는 객체가 있어서 Cloneable에서 느꼈던 복잡한 내용을 이해하지 않아도 되어서 편하다.

compareTo(T o) 의 일반 규약

signum(signum function/부호함수)

  1. signum(x.compareTo(y)) == -signum(y.compareTo(x))
    • equals 일반 규약의 대칭성을 만족해야한다는 의미이다.
    • 두 객체의 비교 순서를 바꾸면 부호만 바뀐 동일한 결과가 나와야 한다.
  2. x.compareTo(y) > 0 && y.compareTo(z) > 0 && x.compareTo(z) > 0 을 만족한다.
    • equals 일반 규약에서 봤던 추이성을 만족해야한다는 의미이다.
  3. 모든 z에 대하여 x.compareTo(y)==0 이면 signum(x.compareTo(z)) == signum(y.compareTo(z)) 를 만족한다.
    • equals 일반규약의 반사성을 만족해야한다는 의미이다.
    • 같은 객체를 순위를 매기면 같은 순위가 나와야 한다.
  4. (권고사항) (x.compareTo(y)==0) == (x.equals(y))
    • compareTo로 정렬한 순서 결과가 equals와 같아야 한다는 의미이다.
    • 정렬된 Collection 객체는 비교할 때 equals 메소드가 아니라 compareTo 메소드를 이용하는 경우도 있으니 주의해서 사용하라는 의미이다.

compareTo는 equals 처럼 상위 객체와 비교하는 책임은 없기에 타입을 신경쓰지 않아도 되기에 equals 의 일반규칙을 모두 따르기 보단 일부만 따른다.


결론

알고리즘 풀 때 compareTo(T o) 를 써본 적은 많았으나 이것도 일반 규약이 있을 줄은 몰랐다. 그러나 equals 에서 나온 내용들로 주를 이루어서 어렵진 않았다.


Reference