객체의 순서를 정하고자 한다면 객체끼리 비교할 수 있어야 합니다.

객체끼리 비교 할 수 조차 없다면 객체의 순서를 정한다는 것은 불가능합니다.

세상에서 순서를 정할때는 반드시 그 기준이 있기 마련입니다. 먼저 태어난 것을 기준으로

사람들의 순서를 세울수도 있고, ,혹은 물건의 값을 기준으로 물건들의 순서를 세울수 있습니다. 순서를 정하고자 한다면 반드시 순서를 정하기 위한 기준이 있어야 합니다.

 

제가 어디서 들은 바로는 야구팬 중에는 크게 두 종류의 팬이 있다고 합니다.

하나는 박철순선수를 좋아하는 야구팬이이고 다른 하나는 철순 선수를 좋아하지 않는

야구팬이라는 겁니다.

자바의 객체도 이와 마찮가지로 두 종류입니다.

하나는 끼리기리 비교할 수 있는 객체이고 다른 하나는 끼리끼리 비교할 수 없는 객체입니다.

자바의 모든 객체는 이 두가지 중에 하나인데, 좀더 구체적으로 살펴본다면 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객체와 비교합니다.

5 - 6

Comparable 인터페이스는 단 한 개의 메소드를 가지고 있습니다.

public int compareTo(Object o)인데, 클래스선언에서 Comparable인터페이스를 구현한다고

선언해주고 클래스에서 이 메소드를 구현해 주면 객체는 비교할 수 있는 객체가 됩니다.

 

Comparable인터페이스를 구현한 객체는 같은 클래스 객체 끼리끼리 서로의 순서를

정할 수 있습니다. 이 순서를 비교할 수 있는 같은 클래스 객체의 Natural Ordering

이라고 합니다.

 

예를 들면 Integer클래스는 Comparable인터페이스를 구현 했기 때문에, 모든 Integer

객체는 끼리끼리 비교할 수 있습니다. , Integer(0) 하고 Integer(1)는 비교할 수 있고,

비교할 수 있기 때문에 서로 서로의 순서가 존재하는데,이순서를 Natural Ordering이라고

합니다.

물론 어떤 객체가 앞 순서이고,어떤 객체가 뒷 순서인지는 각 클래스에서 int compareTo(Object o) 메소드를 어떻게 구현했는지에 따라 다르게 구현되어 있습니다.

일반적으로 숫자의 경우는 작은 값이 앞서고 큰값이 뒤에 섭니다.

String의 경우는 알파벳순서이며, 날짜는 작년이 올해보다 앞섭니다.

 

import java.util.*;

 

/**

* SortedSet의 기본 사용법을 보여줍니다.

* SortedSet에서 객체의 Natrual Ordering을 이용합니다.

*/

public class NaturalOrderingSortedSetDemo {

             public void print(Set s) {

                           Random random = new Random();

 

                           // Set 0부터 9까지 random 숫자를 추가합니다.

                           for(int i = 0; i < 15; i++)

                                        s.add(new Integer(random.nextInt(10)));                      

 

                           // Set에 있는 내용을 탐색합니다.

                           for(Iterator it = s.iterator(); it.hasNext();) {

                                        Integer i = (Integer)it.next();

                                        System.out.print(i + " ");

                           }

                           System.out.println();

             }

             public static void main(String[] args) {

                           NaturalOrderingSortedSetDemo demo = new NaturalOrderingSortedSetDemo();

                           demo.print(new LinkedHashSet());     // 대표적인 Set입니다.

                           demo.print(new TreeSet());  // 대표적인 SortedSet입니다.

             }

}

예제 5 - 7

 


사용자 삽입 이미지

그림 5 - 5 [ run NaturalOrderingSortedSetDemo ]

 

예제 5 - 7 SortedSet의 특징을 간단하게 보여주고 있습니다.

NaturalOrderingSortedSetDemo클래스는 public void print(Set s)메소드를 가지고 있는데,

그 내용은 Set 0부터 9까지의 랜덤한 Integer객체를 15번 만들어서 Set에 추가하고

그 내용을 화면에 출력합니다.

NaturalOrderingSortedSetDemo클래스의 public void print(Set s)의 메소드는 메소드 인자가

Set이므로 일반적인 Set LinkedHashSet 객체도 메소드의 인자로 올수 있고,

SortedSet TreeSet도 메소드의 인자로 올 수 있습니다.

일반 Set LinkedHashSet이 인자로 온 경우는 랜덤하게 선택된 Integer 객체가

Integer 객체의 크기(int )에 따라 정렬되지 않았고, SortedSet TreeSet이 메소드의

인자로 온 경우는 포함된 객체간 Naturaling Ordering으로 순서가 정해진 것을 알 수

있습니다.

이처럼 SortedSet에는 Comparable객체가 포함될 수 있으며, Comparable 객체끼리의

순서는 Comparable 객체의 Natural Ordering에 의해 결정됩니다.

Comparable객체의 Naturaling Ordering public int compareTo(Object o)를 어떻게

구현하는지에 따라 결정됩니다.

Posted by
,