====== the Definition of Iterator Pattern ======
**이터레이터 패턴**의 정의는 다음과 같습니다.
이터레이터 패턴은 컬렉션 구현방법을 노출시키지 않
으면서도 그 집합체 안에 들어 있는 모든 항목에 접근할
수 있게 해 주는 방법을 제공해 줍니다.
이 패턴을 이용하면 집합체 내에서 어떤 식으로 일이 처리되는지에 대해서 전혀 모르는 상태에서
그 안에 들어있는 모든 항목들에 대해서 반복작업을 수행할 수 있습니다.
그런데 디자인에 대한 반복자의 영향도 매우 중요한 부분입니다. 컬렉션 객체안에 들어있는
모든 항목에 접근하는 방식이 통일되어 있으면 어떤 종류의 집합체에 대해서도 사용할 수 있는
다형적인 코드를 만들 수 있기 때문이죠. 메뉴 항목이 배열로 저장되어 있든 %%ArrayList%%로
저장되어 있든 신경쓰지 않고 작업을 처리할 수 있었던 printMenu() 메소드가 그런 예 가운데
하나라고 할 수 있습니다. Iterator 객체만 있으면 되는 거니까요.
또 다른 중요한 점은, 이터레이터 패턴을 사용하면 모든 항목에 일일이 접근하는 작업을 컬렉션
객체가 아닌 반복자 객체에서 맡게 된다는 점입니다. 이렇게 하면 집합체의 인터페이스 및
구현이 간단해질 뿐 아니라, 집합체에서는 반복작업에서 손을 떼고 원래 자신이 할 일
(객체 컬렉션 관리)에만 전념할 수 있게 되니까요.
이제 클래스 다이어그램을 살펴보도록 할까요?
===== Class Diagram =====
{{:study:java:design_pattern:iterator.jpg|Iterator Pattern}}
%%ConcreteIterator%% 구상클래스의 예로 배열에 대해 Iterator 인터페이스를 구현해 보겠습니다.
===== Implement an Iterator interface =====
import java.util.Iterator;
public class DinnerMenuIterator implements Iterator{
MenuItem[] list;
int position = 0;
public DinnerMenuIterator(MenuItem[] list){
this.list = list;
}
public Object next(){
MenuItem menuItem = items[position];
position = position + 1;
return menuItem;
}
public boolean hasNext(){
if(position >= items.length || items[position] == null){
return false;
} else {
return true;
}
}
public void remove(){
if(position <= 0){
throw new IllegalStateException("next()를 한번도 호출하지 않은 상태에서는 삭제할 수 없습니다.");
}
if(list[position-1] !=null){
for(int i = position-1; i < (list.length-1); i++) {
list[i] = list[i+1];
}
list[list.length-1] = null;
}
}
}