Iterator 인터페이스
Iterator인터페이스는 모든 Collection으로부터 얻을 수 인터페이스입니다.
즉, 자신이 Collection이라면 반드시 Iterator 인터페이스(Iterator 인터페이스를 구현한 객체)
를 리턴할 수 있어야 합니다.
Iterator 인터페이스는 Collection에 객체를 한번씩 꺼낼 수 있는 방법을 제공하고 있습니다.
객체의 모임의 형태인 배열의 경우 배열에 있는 특정 객체를 참조하기위해서는 인덱스를
이용해서 특정객체를 바로 참조할 수 있지만, Collection은 가장 일반적인 객체의 모임인
의미 밖에 없으므로 인덱스를 가지고 원하는 객체를 찾을 수 없습니다.
Collection은 갖고 있는 객체를 Iterator를 통해서만 객체를 꺼내 참조할 수 있습니다.
Iterator | |
boolean hasNext() |
Iteration이 객체(elements)를 더 갖고 있으면 확인 합니다. iteration이 객체를 더 갖고 있으면 true 그외 false |
Object next() |
iteration의 다음 객체를 리턴 |
void remove() |
객체를 제거 |
예제 5 - 2는 Collection을 사용하는 간단한 예를 보여주고 있습니다.
import java.util.*;
/**
* 자바 Collection의 기본 사용법을 보여줍니다.
*/
public class CollectionDemo {
public void operation(Collection c1, Collection c2) {
// c1에 Integer객체를 10개 저장합니다.
for(int i = 0; i < 10; i++)
c1.add(new Integer(i));
// c2에 Integer객체를 10개 저장합니다.
for(int i = 5; i < 15; i++)
c2.add(new Integer(i));
// c1 Collection에 c2 Collection에 포함된 객체를 더합니다.
c1.addAll(c2);
// c1 Collection이 Integer객체를 포함하는지 확인합니다.
if (c1.contains(new Integer(11))) {
System.out.println("c1 has " + new Integer(11));
}
else {
System.out.println("c1 doesn't have " + new Integer(11));
}
// c1이 c2에 포함된 객체를 모두 갖고 있는지 확인
if (c1.containsAll(c2)) {
System.out.println("c1 has c2");
}
else {
System.out.println("c1 doesn't have c2");
}
// c2가 c1에 포함된 객체를 모두 갖고 있는지 확인
if (c2.containsAll(c1)) {
System.out.println("c2 has c1");
}
else {
System.out.println("c2 doesn't have c1");
}
System.out.println("c1 size " + c1.size());
System.out.println("c2 size " + c2.size());
// c2를 비움
c2.clear();
System.out.println("c2 clear");
System.out.println("c1 size " + c1.size());
System.out.println("c2 size " + c2.size());
// c1 Collection이 갖고 있는 객체를 모두 한번씩 참조
for(Iterator it = c1.iterator(); it.hasNext();) {
System.out.print(it.next() + " ");
}
System.out.println();
// c1 Collection의 내용을 array로 변경하여 리턴
Integer[] array = (Integer[])c1.toArray(new Integer[0]);
for(int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
CollectionDemo demo = new CollectionDemo();
demo.operation(new ArrayList(),new Vector());
}
}
예제 5 - 2 CollectionDemo.java
그림 5 - 2 [ run CollectionDemo]
예제 5 - 2의 CollectionDemo 클래스의 public void operation(Collection c1,
Collection c2) 메소드를 살펴보면 Collection 인터페이스의 기본적인 사용법을 알 수
있습니다.
Integer 0 부터 9까지를 Collection c1 에 추가하고, 5부터 14까지 Collection c2에 추가
합니다. c1 컬렉션에 Integer객체 10개 c2 컬렉션에 Integer객체 10개를 추가했습니다.
간혹 어떤 분들은 프리미티브 형 int을 컬렉션에 추가 하려고 하는 분이 있는데
그것은 안됩니다. 왜냐하면 프리미티브 형은 객체가 아니기 때문입니다. 켈렉션에
포함 될수 있는 것은 객체입니다. 컬렉션은 객체와만 관계가 있지 프리미티브 형 데이터
와는 아무런 연관이 없습니다. 프리미티브 형 데이터를 컬렉션에 추가할 수 없습니다.
프리미티브 형 데이터를 Collection에 추가하고자 한다면 프리미티브 형 데이타의
Wrapper형 객체를 Collection에 추가하고, 나중에 Collection 으로 부터 객체를 꺼낸 후에
Wrapper형 객체로부터 프리미티브 형의 값을 꺼내시면 됩니다.
즉 숫자 0 부터 9까지, 5부터 14까지를 추가하고자 한다면 CollectionDemo클래스에서
처럼 프리미티브 데이터형인 int 값을 Wrapper형인 Integer(0)부터 Integer(9),
Integer(5)부터 Integer(14) 객체를 Collection에 추가를 합니다.
추후에 컬렉션으로부터 Integer객체를 꺼낸후에, Integer객체의 intValue()라는 메소드를
이용해서 프리미티브 데이터값을 얻으면 됩니다.
Collection은 추가되는 객체가 중복이 되는지, 혹은 추가되는 순서에 대해서는 전혀
관심이 없고, 알 수도 없습니다.
c1 컬렉션에 c2 컬렉션의 내용을 더하면 c1컬렉션에는 기존 c1 컬렉션에서 갖고 있던
0 부터 9 까지의 Integer객체에 , c2 컬렉션이 갖고 있던 5 부터 14까지 Integer객체가
추가되면 그 결과가 어떻게 될지 알 수 없다는 뜻입니다. 실행을 시켜봐야만 그 결과를
알 수 있습니다.
Collection이 갖고 있는 객체를 참조하고자 할 때는 Iterator 인터페이스를 이용하는
방법 밖에 없습니다.
왜냐하면 Collection에는 갖고 있는 객체를 직접 참조할 수 있도록 하는 인덱스라는
개념이 없기 때문입니다. 모든 Collection은 iterator()라는 메소드를 갖고 있기 때문에
Iterator를 구할 수 있습니다. 일단 Iterator를 구하면 쭈욱 한번씩 객체를 참조할 수 있는데,
하지만 약간의 불행은 Iterator 로부터 가져오는 객체는 모든 객체의 기본인
java.lang.Object 형이라는 것입니다.
왜냐하면 어떤 객체든 담고, 보관해야 하는 Collection의 성격상 객체가 Collection에
추가될 때부터 원래 객체의 데이터형 정보(클래스형 정보)를 잃어버리기 때문입니다.
표 5 - 1의 Collection 인터페이스의 메소드에서 객체를 추가하는 메소드를 살펴보면
메소드의 인자가 java.lang.Object인 것을 알 수 있습니다.
이런 이유로 Collection에서 객체를 꺼낼 때도 객체의 데이터형은 java.lang.Object
입니다. Collection에서 꺼낸 객체를 이용하고자 할 때는 Collectino에 추가되기 전의
원래 데이터 형으로 형 변환을 해서 사용해야 합니다.
예제 5 - 2에서는 구체적인 형 변환을 하지 않고,여기서는 단순히 System클래스의
println()메소드를 이용해서 객체의 String 표현을 출력하고 있습니다.
예제 5 - 2는 Collection과 배열과의 관계를 적절하게 보여주고 있는데, Collection 이나
배열 모두 객체들의 모임을 다루고자 할 때 사용하는 것임에는 분명합니다.
만약 Collection이 갖고 있는 객체가 예제 5 - 2처럼 모두 동일한 종류의 객체들이라면
(여기서는 Integer객체) 배열로도 얼마든지 전환할 수 있습니다.
Collection의 객체들이 배열로 전환되면 인덱스를 이용하여 직접 객체를 참조할 수
있습니다.
예제 5 - 2의 public void static main(String[] args) 에서 재밌는 부분은 CollectionDemo
객체의 public void operation(Collection c1,Collection c2) 메소드의 인자로 사용된 ArrayList
객체와 Vector 객체인데 이들 모두 대표적인 Collection 이라는 것입니다.
그래서 두 객체는 비록 클래스는 다르지만 어쨋거나 Collection인 관계로 폴리모피즘
덕분에 CollectionDemo의 public void operation(Collection c1,Collection c2)에 자연스럽게
사용될 수 있습니다.
'자바 Basic > 자바컬렉션' 카테고리의 다른 글
자바공부-6.Sorted Set 인터페이스 (0) | 2007.12.06 |
---|---|
자바공부-5.List 인터페이스와 ListIterator 인터페이스 (1) | 2007.12.06 |
자바공부-4.Set 인터페이스 (1) | 2007.12.06 |
자바공부-2.컬렉션(Collection) 인터페이스 (1) | 2007.12.05 |
자바공부-1.자바컬렉션 프레임워크 (1) | 2007.12.05 |