Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed

the Definition of Iterator Pattern

이터레이터 패턴의 정의는 다음과 같습니다.

 이터레이터 패턴은 컬렉션 구현방법을 노출시키지 않
으면서도 그 집합체 안에 들어 있는 모든 항목에 접근할
수 있게 해 주는 방법을 제공해 줍니다.

이 패턴을 이용하면 집합체 내에서 어떤 식으로 일이 처리되는지에 대해서 전혀 모르는 상태에서 그 안에 들어있는 모든 항목들에 대해서 반복작업을 수행할 수 있습니다. 그런데 디자인에 대한 반복자의 영향도 매우 중요한 부분입니다. 컬렉션 객체안에 들어있는 모든 항목에 접근하는 방식이 통일되어 있으면 어떤 종류의 집합체에 대해서도 사용할 수 있는 다형적인 코드를 만들 수 있기 때문이죠. 메뉴 항목이 배열로 저장되어 있든 ArrayList로 저장되어 있든 신경쓰지 않고 작업을 처리할 수 있었던 printMenu() 메소드가 그런 예 가운데 하나라고 할 수 있습니다. Iterator 객체만 있으면 되는 거니까요.

또 다른 중요한 점은, 이터레이터 패턴을 사용하면 모든 항목에 일일이 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체에서 맡게 된다는 점입니다. 이렇게 하면 집합체의 인터페이스 및 구현이 간단해질 뿐 아니라, 집합체에서는 반복작업에서 손을 떼고 원래 자신이 할 일 (객체 컬렉션 관리)에만 전념할 수 있게 되니까요.

이제 클래스 다이어그램을 살펴보도록 할까요?

Class Diagram

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;
       }
    }
}

QR Code
QR Code study:java:design_pattern:iterator (generated for current page)