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

Behavior Pattern (행동 관련 패턴)

  • 클래스와 객체들이 상호작용하는 방법 및 역할을 분담하는 방법과 관련된 패턴

Iterator Pattern (반복자 패턴)

  • 모든 항목에 일일이 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체에서 맡게 됩니다.
  • 이것은 집합체의 인터페이스 및 구현이 간단해질 뿐만 아니라, 집합체에서는 반복 작업에서 손을 떼고 원래 자신이 할 일에만 전념할 수 있습니다.

예시

'1차열 배열로 메뉴판을 구현한 A 가게 & ArrayList로 메뉴판을 구현한 B 가게'가 있습니다. 두 가게가 병합하여 한 명의 직원이 서빙을 할 때, 데이터를 읽어오는 방법을 구현해야 합니다.

  1. 이터레이터 패턴을 사용하지 않은 경우 서빙 알바의 코드
public class Waitress {
    PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
    ArrayList breakfastItems = pancakeHouseMenu.getMenuItems();
    
    DinerMenu dinerMenu = DinerMenu();
    MenuItem[] lunchItems = dinerMenu.getMenuItems();
    
    //ArrayList 데이터를 읽어오는 방식으로 B가게 메뉴를 가져옵니다.
    for(int i = 0; i < breakfastItems.size(); i++) {
    	MenuItem menuItem = (MenuItem)breakfastItems.get(i);
        System.out.print(menuItem.getName() + " ");
        System.out.println(menuItem.getPrice() + " ");
        System.out.println(menuItem.getDescription() + " ");
    }
    
    //1차원 배열의 데이터를 읽어오는 방식으로 A가게 메뉴를 가져옵니다.
    for(int i = 0; i < lunchItems.length; i++) {
    	MenuItem menuItem = lunchItmes[i];
        System.out.print(menuItem.getName() + " ");
        System.out.println(menuItem.getPrice() + " ");
        System.out.println(menuItem.getDescription() + " ");
    }
}
  1. 이터레이터 패턴 적용한 경우 서빙 알바의 코드
public class Waitress {
    PancakeHouseMenu pancakeHouseMenu;
    DinerMenu dinerMenu;
    
    public Waitress(PancakeHouseMenu pancakeHouseMenu, DinerMenu dinerMenu) {
    	this.pancakeHouseMenu = pancakeHouseMenu;
        this.dinerMenu = dinerMenu;
    }
    
    public void printMenu() {
    	Iterator pancakeIterator = pancakeHouseMenu.createIterator();
        Iterator dinerIterator = dinerMenu.createIterator();
        System.out.println("메뉴\n----\n아침메뉴")
        printMenu(pancakeIterator);
        System.out.println("\n점심메뉴");
        printMenu(dinerIterator);
    }
    
    private void printMenu(Iterator iterator) {
    	while (iterator.hasNext()) {
        	MenuItem menuItem = (MenuItem)iterator.next();
            System.out.print(menuItem.getName() + ", ");
            System.out.print(menuItem.getPrice() + " -- ");
            System.out.println(menuItem.getDescription());
        }
    }
}

차이점

위의 코드를 비교해보면 서빙 직원이 데이터를 읽어오는 작업을 따로 하지 않고 Iterator가 던져준 데이터를 보여주는 것을 확인할 수 있습니다. 이것은 모든 서빙 직원이 읽어오는 방식을 하나로 통일 할 수 있으며, 잘못 읽어오는 버그가 생긴 경우에 이것을 뿌려주는 반복자 하나만 확인하면 쉽게 유지보수를 할 수 있다는 장점을 가져올 수 있습니다.

코틀린으로 이터레이터 패턴 보기

https://github.com/sgmsgood/DesignPattern_Kotlin/tree/master/IteratorDesign/src/main/kotlin

profile
Android, Flutter 앱 개발자입니다.

0개의 댓글