CompareTo 메서드는 Object에 선언되어 있지 않으며, Comparable 인터페이스에 포함된 유일한 메서드이다.
Object의 equals 메서드와 비슷한 특성을 가지고 있으나, 동치성 검사를 넘어 순서 비교도 가능하다.
Comparable 인터페이스를 구현한 객체들은 검색하거나, 정렬, 최대/최소 구하기 등이 간단하며
정렬도 다음과 같이 간단하게 진행 할 수 있다.
Arrays.sort(a)
그렇기에 알파벳 순서나 값의 크기, 또는 시간적 선후 관계처럼 명확한 자연적 순서를 가지는 값을 가진
클래스를 구현할 때는 Comparable 인터페이스를 구현하는 것이 좋다.
1 2 3 4 | Public interface Comparable<T> { int compareTo(T t); } | cs |
CompareTo의 계산 방식은 다음과 같다.
현재 객체의 값이 주어진 객체의 값 보다 작으면 음수, 같으면 0, 크면 양수를 반환한다.
인자로 전달된 값이 계산이 불가능한 경우에는 ClassCast Exception 예외를 던진다.
CompareTo의 규약
객체 참조를 비교하는 방향은 뒤집어도 객체간 대소 관계는 유지되어야 한다.
첫 번째 객체가 두 번째 객체보다 크고 두 번째 객체가 세 번째 객체보다 클 경우 첫 번째 객체는 세 번째 객체보다 크다.
Equals메서드와 같이 반사성, 대칭성, 추이성이 만족해야 한다.
compareTo를 통한 동치성 검사 결과는 equals 메서드의 결과와 같아야 한다.
비교를 진행할 값이 여러 개인 경우 중요한 변수부터 진행한다.
CompareTo와 equlas 구현의 차이
Comparable 인터페이스가 자료형을 인자로 받는 제네릭 인터페이스이므로 compareTo 메서드의 인자 자료형은 컴파일 시간에 정적으로 결정된다. Equlas는 Object를 인자로 받는다.
compareTo 메서드의 필드 비교 방식은 동치성 검사라기보다는 순서 비교를 위해 사용된다.
출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙12 인용.
'JAVA > Effective Java' 카테고리의 다른 글
클래스와 인터페이스 - 규칙 14 public 클래스 안에는 public 필드를 두지 말고 접근자 메서드를 사용하라 (0) | 2018.05.29 |
---|---|
클래스와 인터페이스 - 규칙 13 클래스와 멤버의 접근권한은 최소화하라. (0) | 2018.05.29 |
모든 객체의 공통 메서드 - 규칙 11 clone을 재정의할 때는 신중하라 (0) | 2018.05.29 |
모든 객체의 공통 메서드 - 규칙 10 toString은 항상 재정의하라 (0) | 2018.05.29 |
모든 객체의 공통 메서드 - 규칙 9 equals를 재정의할 때는 반드시 hashCode도 재정의하라 (0) | 2018.05.29 |