티스토리 뷰

compareTo 메서드는 Object에 선언되어 있지 않다. 사실 이 메서드는 Comparable 인터페이스에 포함된 유일한 메서드다. Object의 equals 메서드와 특성은 비슷하지만, 단순한 동치성 검사 이외에 순서 비교가 가능하다. Comparble을 구현한 클래스는 다양한 제네릭 알고리즘 및 컬랙션 구현체와 상호 연동이 가능하다. Comparable 인터페이스를 구현하는 클래스의 객체들은 자연적 순서(natural ordering)를 갖게 된다.

 

compareTo 메서드의 일반 규약은 equals와 비슷하다. 객체의 값이 인자로 주어진 객체보다 작으면 음수를, 같으면 0을, 크면 양수를 반환한다. sgn(expression)은 수학에서의 signum 함수를 나타내는 것으로, -1, 0, 1 가운데 한 값을 반환한다. 어떤 값이 반환될지는 expression의 값에 따라 결정된다. 비교 불가능한 자료형일 경우 ClassCastException을 발생시킨다. compreTo 메서드가 반환될 때 -2^31 ~ 2^31 범위 값을 리턴해야 한다. 값의 범위를 넘을 경우에는 오버플로우가 발생하여 엉뚱한 결과가 나타난다.

 

compareTo() 구현 조건

sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 좌변이 Exception을 던지면 우변도 Exception을 던져야 한다. 그 역도 성립해야 한다.

추이성(transitivity)이 만족되도록 해야 한다. x.compareTo(y) >0 && y.compareTo(z) > 0 조건을 만족하면 x.compareTo(z) > 0 역시 만족해야 한다. 

x.compareTo(y) == 0 이면 sgn(x.compareTo(z)) == sgn(y.compareTo(z))의 관계가 모든 z에 대해 성립하도록 해야 한다.

(x.compareTo(y) == 0) == (x.equals(y)) 해당 조건은 절대적으로 지켜야 할 조건은 아니지만 이 조건을 만족하는 것을 권장한다.

equals 메서드와 일관된 결과를 갖도록 하는 것이 좋다.

new BigDecimal("1.0")과 new BigDecimal("1.00") 두 개의 객체를 HashSet에 추가한다면 두 객체 모두 저장된다. 두 BigDecimal 객체가 다른 것(HashCode 다름)으로 판정되기 때문이다. 하지만 TreeSet을 사용한다면 CompareTo 메서드를 사용해서 비교하므로 BigDecimal 객체가 같은 것으로 판정된다.

 

compareTo()와 equals()의 차이점

Comparable 인터페이스가 자료형을 인자로 받는 제네릭 인터페이스이므로 compareTo 메서드의 인자 자료형은 컴파일 시간에 정적으로 결정된다. 따라서 인자로 받은 객체의 자료형을 검사하거나 형 변환할 필요가 없다. 잘못된 자료형을 넘길 경우 아예 컴파일이 되지 않는다.

null이 인자로 전달되는 경우 compareTo 메서드는 반드시 NullPointerException 예외가 발생한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함