compareTo 는 java.lang.object 에 구현되어있는게 아니라 Comparable 인터페이스에 있다.
Comparble 인터페이스를 구현하면 자바의 수많은 알고리즘 및 컬랙션 클래스들과 상호 연동이 가능하다. 자바 라이브러리의 모든 값 클래스들은 Comparable 인터페이스를 구현한다.
작으면 음수 크면 양수 같으면 0 비교할수없으면 ClassCastException 을 발생시킨다.
eqauls 와 같은 일관된 결과를 갖도록 하는것이 좋다.
new BigDecimal("1.0") 과 new BigDecimal("1.00") 두 개의 객체를 HashSet 에 추가한다면 두객체 모두 저장될것이다. 두 BigDecimal 객체가 다른것으로 판정되기 때문 (hashCode 다름). 하지만 TreeSet을 사용한다면 CompareTo 메소드를 사용해서 비교하므로 BigDecimal 객체가 같은것으로 판정된다.
정렬 컬랙션들(내부적으로 정렬을 하는, TreeMap, TreeSet )은 컬랙션 인터페이스(Collection, Set, Map) 등의 보편적 계약을 따르지 않을수 있다. 컬렉션 인터페이스의 보편적인 계약은 eqauls 를 메소드 관점에서 정하고 정렬컬랙션들은 eqauls 대신 compareTo 로 동일 여부를 검사하는데 사용함.
compareTo 메소드 내부에서 비교 객체의 타입을 확인하거나 타입 변환 할 필요없다. 타입이 잘못되면 당연히 컴파일 에러가 발생하게 되어있다.
Comparable : 기본 정렬 기준을 구현하는데 사용 (java.lang)
Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자 할때 사용 (java.util)
자연율 순서와 다른 순서매김을 사용할 필요가 있다면 Comparator 인터페이스를 대신하여 사용할수 있다.
compareTo 가 음수를 리턴할수는 있지만 -2^31 ~ 2^31-1 범위 안에 값을 리턴해야한다! (오버 플로우가 날 경우 엉뚱한 결과가 나올수 있다.)