이터레이터 패턴의 정의는 다음과 같습니다.
이터레이터 패턴은 컬렉션 구현방법을 노출시키지 않 으면서도 그 집합체 안에 들어 있는 모든 항목에 접근할 수 있게 해 주는 방법을 제공해 줍니다.
이 패턴을 이용하면 집합체 내에서 어떤 식으로 일이 처리되는지에 대해서 전혀 모르는 상태에서 그 안에 들어있는 모든 항목들에 대해서 반복작업을 수행할 수 있습니다. 그런데 디자인에 대한 반복자의 영향도 매우 중요한 부분입니다. 컬렉션 객체안에 들어있는 모든 항목에 접근하는 방식이 통일되어 있으면 어떤 종류의 집합체에 대해서도 사용할 수 있는 다형적인 코드를 만들 수 있기 때문이죠. 메뉴 항목이 배열로 저장되어 있든 ArrayList로 저장되어 있든 신경쓰지 않고 작업을 처리할 수 있었던 printMenu() 메소드가 그런 예 가운데 하나라고 할 수 있습니다. Iterator 객체만 있으면 되는 거니까요.
또 다른 중요한 점은, 이터레이터 패턴을 사용하면 모든 항목에 일일이 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체에서 맡게 된다는 점입니다. 이렇게 하면 집합체의 인터페이스 및 구현이 간단해질 뿐 아니라, 집합체에서는 반복작업에서 손을 떼고 원래 자신이 할 일 (객체 컬렉션 관리)에만 전념할 수 있게 되니까요.
이제 클래스 다이어그램을 살펴보도록 할까요?
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; } } }