Iterator Pattern : 컨테이너의 구조는 캡슐화 하고 컬렉션 내의 원소에 순차적으로 접근할 수 있도록 해준다. 반복자 라는 단어가 의미하듯 Iterator를 제공하여 컬렉션의 내용물을 반복접근할 수 있으며 컨테이너의 구현이 어떻든간에 동일한 방법으로 원소에 접근할 수 있도록 해준다.
Iterator는 c++의 STL을 접해본 사람이라면 익숙한 개념이다. java의 ArrayList 같은 기본제공 컨테이너도 Iterator를 제공한다.
많은 사람들이 우려하는게 Iterator를 사용하면 느려진다는것이다. Iterator 자체가 하나의 객체이며 내부 구현에 있어서도 단순히 for루프를 도는것 보다는 많은 일을 처리한다. 때문에 for루프를 통해 원소에 접근하는것보다 10배이상 느린 속도를 보인다. 하지만 Iterator를 사용함으로써 컨테이너 인덱스 관리의 책임을 컨테이너에게 넘겨주고, 보다 유연한 코드를 만들 수 있다.
또한 어떤 컨테이너가 되었든 Iterator를 사용하여 접근하는 방식은 통일되므로 클라이언트에서 제공하는 컨테이너에 대한 처리를 구현할 때 일반화된 구현을 보여줄 수 있다.
java.util의 Iterator<E> 를 구현하는 MyArrayList를 만들어보자
/* MyArrayList.java */
public class MyArrayList<T> {
private Object[] items;
private int count;
private int capacity;
public MyArrayList(){
this.count = 0;
this.capacity = 1;
items = new Object[this.capacity];
}
public MyArrayList(int capacity){
this.count = 0;
this.capacity = capacity;
items = new Object[this.capacity];
}
private class MyArrayListIterator implements Iterator<T>
{
private int pos;
public MyArrayListIterator(){
pos = 0;
}
@Override
public T next() {
if( hasNext() )
return ((T)items[pos++]);
else
return null;
}
@Override
public boolean hasNext() {
if(pos < count)
return true;
else
return false;
}
@Override
public void remove() {
//remove the item..
}
}
public Iterator getIterator(){
return new MyArrayListIterator();
}
public void add(T item){
items[count++] = item;
if(count == capacity){
capacity *= 2;
Object[] array = new Object[capacity];
for(int i=0; i<count; i++){
array[i] = items[i];
}
items = array;
}
}
}
/* main */
public static void main(String[] args){
MyArrayList<Integer> myArrayList = new MyArrayList<Integer>();
for(int i=0; i<10; i++){
myArrayList.add(i);
}
for(Iterator<Integer> iterator = myArrayList.getIterator(); iterator.hasNext(); ){
Integer integer = ((Integer)iterator.next());
System.out.println("iterator : " + integer.toString());
}
}
분명 새롭게만든 컨테이너 구조물이지만, Iterator의 사용자체는 기존 자바에서 제공되는 컨테이너를 사용할때와 차이가없다.
'Coding Note' 카테고리의 다른 글
[Design pattern] Bridge (0) | 2013.02.20 |
---|---|
[Design pattern] Adapter (0) | 2013.02.20 |
[Design pattern] Command (0) | 2013.02.04 |
[Design pattern] Chain of Responsibliity (1) | 2013.02.02 |
[Design pattern] Prototype (1) | 2013.02.01 |