JavaStudy

ITEM 12 : Comparable 인터페이스의 구현을 고려하자

  • 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 범위 안에 값을 리턴해야한다! (오버 플로우가 날 경우 엉뚱한 결과가 나올수 있다.)