질럿 클래스는 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을 이용해서 순서를 정하고자 한다면 이 부분을 조심해야 합니다.
'자바 Basic > 자바컬렉션' 카테고리의 다른 글
자바공부-10.컬렉션(Collection) 예제 프로그램 (1) | 2007.12.06 |
---|---|
자바공부-9.Comparator 인터페이스 (0) | 2007.12.06 |
자바공부-7.Comparable 인터페이스 (0) | 2007.12.06 |
자바공부-6.Sorted Set 인터페이스 (0) | 2007.12.06 |
자바공부-5.List 인터페이스와 ListIterator 인터페이스 (1) | 2007.12.06 |