질럿 클래스는 Comparable 인터페이스를 구현하지 않았기 때문에
질럿 객체끼리의
Natural Ordering은 없습니다.

여기서는 질럿 객체끼리의 순서를 나타내는 Natural Ordering
을 만들어 보겠습니다.

물론 Natural Ordering을 만들기 위해서는 Comparable 인터페이스를 구현하면 됩니다.



 

import java.util.*;

 

/**

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

* Zealot 객체의 Natrual Ordering을 이용합니다.

*/

public class Zealot implements Comparable {

 

             private int strength;

             private int shields;

            

             public Zealot(int strength,int shields) {

                           this.strength = strength;

                           this.shields = shields;        

             }

             public int getStrength() {

                           return strength;

             }

             public int getShields() {

                           return shields;

             }

            

             /**

             * 체력이 큰 질럿일 수록 앞쪽에 섭니다.

             */

             public int compareTo(Object o) {

                           Zealot z = (Zealot)o;           // o는 비교대상이 되는 질럿

                          

                           if (z.getStrength() > strength)

                                        return 1;

                           else if (z.getStrength() == strength)

                                        return 0;

                           else

                                        return -1;

             }

            

             public static void main(String[] args) {

 

                           Random random = new Random();

 

                           // 10개의 질럿을 만듭니다.

                           Set s = new TreeSet();

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

                                        s.add(new Zealot(random.nextInt(100),random.nextInt(100)));                    

 

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

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

                                        Zealot z = (Zealot)it.next(); 

                                        System.out.print(z.getStrength() + " ");

                           }

                           System.out.println();                        

             }

}

예제 5 - 8 Zealot.java

 

예제 5 - 8 Zealot객체를 비교할 수 있는 객체, Comparable 인터페이스를 구현한

객체로 만들어 보았습니다. Comparable 인터페이스를 구현한 객체는 자기들, 여기서는

zealot 객체끼리 비교할 수 있습니다. zealot 객체끼리 Natural Ordering이 존재한다는

뜻입니다.

예제 5 - 8과 같이 Comparable인터페이스를 구현하기만 하면 객체들은 같은 클래스

객체끼리 순서를 정할 수 있습니다.

 

사용자 삽입 이미지

 그림 5 - 6 [run Zealot]

 

Natural Ordering이 있는 객체는 SortedSet에 얼마든지 추가 될 수 있습니다.

SortedSet에서 객체의 Natural Ordering을 감안해서 순서를 정하니까요.

Natural Ordering  끼리끼리 즉, 같은 클래스에 속하는 객체끼리의 순서를 의미합니다.

Natural Ordering이 있는 다른 클래스의 객체와 순서를 정할 수 있는 것은 아닙니다.

 

Integer Long과는 Natural Ordering이 성립되지 않습니다. 언뜻 생각하기에 Integer

Long은 서로 순서가 있는 것 같지만 객체간의 Natural Ordering이 성립하기 위해서는

             A.compareTo(B)    그리고 B.compareTo(A)와 같은  연산이 성립되어야 하는데

Integer Long은 클래스가 다르기 때문에 java.lang.ClassCastException이 발생합니다.

 

 

import java.util.*;

 

/**

* Natrual Ordering의 잘못된 사용법을 보여줍니다.

*/

 

public class WrongNaturalOrderingSortedSetDemo {

            

             public static void main(String[] args) {

                           SortedSet set = new TreeSet();

                           set.add(new Integer(1));

                           set.add(new Long(2));

                           set.add(new Double(3.0));

             }

}

예제 5 - 9 WrongNaturalOrderingSortedSetDemo.java

 


사용자 삽입 이미지

그림 5 - 7 [ run WrongNaturalOrderingSortedSetDemo ]

 

예제 5 - 9를 실행시키면 예상한 바와 같이 ClassCastException이 발생합니다.

왜냐하면 Integer Long은 같은 클래스가 아니기 때문입니다. SortedSet에 포함될수

있는 객체들, 즉 객체의 Natural Ordering을 이용해서 포함될 수 있는 객체들은 모두

같은 클래스 객체이어야 합니다. 그렇지 않다면 그림 5 -  7과 같은 실행시 런타임

에러가 발생합니다.

 

일반적으로 자바의 대부분의 객체는 비교 가능한 객체가 아닙니다.

생각해보세요. 여러분이 만든 그 많은 클래스 중에 Comparable 인터페이스를 구현한

클래스가 몇 개나 될까요. Comparable인터페이스를 구현하지 않은 객체는 순서를 비교할

수 없기 때문에 이 객체를 SortedSet에 추가 할 수 없습니다. 

그리고 Comparable 인터페이스를 구현한 객체라 해도 SortedSet에는 모두 같은 형의

객체를 추가해야 합니다. 데이터형이 다른 객체를 넣으면 그림 5 - 7처럼

ClassCastException 에러가 납니다.

Natural Ordering을 이용해서 순서를 정하고자 한다면 이 부분을 조심해야 합니다.

 

Posted by
,