Comparable 인터페이스
이 클래스로 만들어진 객체들은 순서를 매길 수 있도록 하는 인터페이스이다.
주로 정렬에 사용되며 이외에도 검색, 극단값 계산등에도 이용할 수 있다.
Clonable과 달리 compareTo(T o)
라는 자기 자신을 가리키는 객체가 있어서 Cloneable에서 느꼈던 복잡한 내용을 이해하지 않아도 되어서 편하다.
compareTo(T o) 의 일반 규약
signum(signum function/부호함수)
- signum(x.compareTo(y)) == -signum(y.compareTo(x))
- equals 일반 규약의 대칭성을 만족해야한다는 의미이다.
- 두 객체의 비교 순서를 바꾸면 부호만 바뀐 동일한 결과가 나와야 한다.
- x.compareTo(y) > 0 && y.compareTo(z) > 0 && x.compareTo(z) > 0 을 만족한다.
- equals 일반 규약에서 봤던 추이성을 만족해야한다는 의미이다.
- 모든 z에 대하여 x.compareTo(y)==0 이면 signum(x.compareTo(z)) == signum(y.compareTo(z)) 를 만족한다.
- equals 일반규약의 반사성을 만족해야한다는 의미이다.
- 같은 객체를 순위를 매기면 같은 순위가 나와야 한다.
- (권고사항) (x.compareTo(y)==0) == (x.equals(y))
- compareTo로 정렬한 순서 결과가 equals와 같아야 한다는 의미이다.
- 정렬된 Collection 객체는 비교할 때 equals 메소드가 아니라 compareTo 메소드를 이용하는 경우도 있으니 주의해서 사용하라는 의미이다.
compareTo는 equals 처럼 상위 객체와 비교하는 책임은 없기에 타입을 신경쓰지 않아도 되기에 equals 의 일반규칙을 모두 따르기 보단 일부만 따른다.
결론
알고리즘 풀 때 compareTo(T o) 를 써본 적은 많았으나 이것도 일반 규약이 있을 줄은 몰랐다. 그러나 equals 에서 나온 내용들로 주를 이루어서 어렵진 않았다.
Reference
'study > effective java' 카테고리의 다른 글
[item15] 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2023.05.06 |
---|---|
[item13] clone 오버라이딩은 주의해서 진행해라 (0) | 2023.05.02 |
[item12] toString은 항상 오버라이딩하라 (0) | 2023.05.02 |
[item11] equals와 hashCode는 같이 정의해라 (0) | 2023.05.01 |
[item10] equals는 일반 규약을 지켜 재정의해라 (0) | 2023.05.01 |