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)에 자연스럽게

사용될 수 있습니다.

Posted by
,