Java

Comparable 인터페이스

bang2001 2013. 7. 24. 20:03

객체의 순서를 정하고자 한다면 객체끼리 비교할 수 있어야 합니다. 객체끼리 비교 할 수 조차 없다면 객체의 순서를 정한다는 것은 불가능합니다. 세상에서 순서를 정할때는 반드시 그 기준이 있기 마련입니다. 먼저 태어난 것을 기준으로 사람들의 순서를 세울수도 있고, ,혹은 물건의 값을 기준으로 물건들의 순서를 세울수 있습니다. 순서를 정하고자 한다면 반드시 순서를 정하기 위한 기준이 있어야 합니다.

 

제가 어디서 들은 바로는 야구팬 중에는 크게 두 종류의 팬이 있다고 합니다. 하나는 박철순선수를 좋아하는 야구팬이이고 다른 하나는 박철순 선수를 좋아하지 않는 야구팬이라는 겁니다.

 

자바의 객체도 이와 마찮가지로 두 종류입니다. 하나는 끼리기리 비교할 수 있는 객체이고 다른 하나는 끼리끼리 비교할 수 없는 객체입니다.

자바의 모든 객체는 이 두가지 중에 하나인데, 좀더 구체적으로 살펴본다면 Comparable 인터페이스를 구현한 객체는 비교할 수 있는 객체이고, 그 외는 모두 비교할 수 없는 객체입니다. 클래스가 Comparable인터페이스를 구현한 객체는 비교할 수 있는 객체이고,

클래스가 Comparable인터페이스를 구현하지 않은 객체는 비교할 수 없는 객체입니다. 


즉, 지금까지 만들어본 Zealot클래스,BigRib클래스등은 Comparable 인터페이스를 구현하지 않았기 때문에  Zealot객체, BigRib 객체들은 비교할 수 없는 객체들입니다. 아주 간단한 내용입니다. Comparable 객체는 비교할 수 있는 객체, 그외는 비교할 수 없는 객체. SortedSet은 그 타고난 성격상 비교가 가능한 객체를 포함할 수 있습니다. 만약 객체끼리 비교할 수 없다면 SortedSet에서는 객체끼리 비교를 해서 순서를 결정 지을 수 없기 때문입니다.

 

자바에서 제공하는 핵심클래스중에 비교할 수 있는 객체는 즉, Comparable 인터페이스를 구현한 객체는 대표적으로 Byte, Character, Double, File,Float, Integer, Long, ObjectStreamField, Short, String, BigDecimal, BigInteger, URI, Charset, Date, CollationKey

등이 있습니다.  여러분이 만드는 객체를 비교할 수 있는 객체로 만들고 싶다면 클래스를 설계할 때 Comparable 인터페이스를 구현하면 됩니다.

 


  Comparable
 int compareTo(Object o)  순서를 짓기 위해서 o객체와 비교합니다.


 

Comparable 인터페이스는 단 한 개의 메소드를 가지고 있습니다. public int compareTo(Object o)인데, 클래스선언에서 Comparable인터페이스를 구현한다고 선언해주고 클래스에서 이 메소드를 구현해 주면 객체는 비교할 수 있는 객체가 됩니다.

 

Comparable인터페이스를 구현한 객체는 같은 클래스 객체 끼리끼리 서로의 순서를 정할 수 있습니다. 이 순서를 비교할 수 있는 같은 클래스 객체의 Natural Ordering이라고 합니다.

 

예를 들면 Integer클래스는 Comparable인터페이스를 구현 했기 때문에, 모든 Integer형 객체는 끼리끼리 비교할 수 있습니다. 즉, Integer(0) 하고 Integer(1)는 비교할 수 있고, 비교할 수 있기 때문에 서로 서로의 순서가 존재하는데,이순서를 Natural Ordering이라고

합니다. 


물론 어떤 객체가 앞 순서이고,어떤 객체가 뒷 순서인지는 각 클래스에서 int compareTo(Object o) 메소드를 어떻게 구현했는지에 따라 다르게 구현되어 있습니다. 일반적으로 숫자의 경우는 작은 값이 앞서고 큰값이 뒤에 섭니다. String의 경우는 알파벳순서이며, 날짜는 작년이 올해보다 앞섭니다.



출처 : http://scarlett.tistory.com/45