Ch.9 반복자 패턴과 컴포지트 패턴

컬렉션 잘 관리하기

About

예제로 팬케이크 하우스에서 파는 아침 메뉴와 객체마을 식당에서 파는 점심 메뉴를 둘 다 제공하는 식당이 나온다. 메뉴판을 만들기 위해 메뉴 항목을 반환하기 위해 반복을 해야 하는데, 두 식당의 아침, 점심 메뉴에 들어갈 항목이 다르다.

The Code

Iterator Pattern (반복자 패턴)

반복자 패턴을 적용해 Iterator 인터페이스 및 식당 메뉴별 구현 클래스를 구현해 메뉴판에 있는 각 메뉴에 맞게 순회할 수 있도록 처리한다.

보통 언어별로 iterator를 지원하니 해당 iterator를 사용하면 편하다. 자바에서는 java.util.Iterator를 쓰면 편하다.

  • 자바의 경우 iterator 객체를 생성해 hasNext(), next()로 다음 아이템을 가져올 수 있고, 향상된 for문을 이용해서도 가져올 수 있다.

  • 반복자만 제대로 구현하면 컬렉션이 배열이든, Map이든 상관 없이 순회할 수 있다.

반복자 패턴(Iterator Pattern)은 컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법을 제공한다.

Composite Pattern (컴포지트 패턴)

하지만 여전히 중복되거나 바뀌기 쉬운 코드들이 존재한다. 새로운 메뉴를 추가할 때마다 생성자를 수정해야 한다. 그리고 기존 메뉴에서 종류를 나눠 서브메뉴를 추가할 수도 없다.

이럴 때 트리 구조를 이용하여 메뉴, 서브메뉴, 메뉴 항목 등을 모두 넣을 수 있는 컴포지트 패턴을 사용하면 된다.

컴포지트 패턴(Composite Pattern)으로 객체를 트리구조로 구성해서 부분-전체 계층구조를 구현한다. 컴포지트 패턴을 이용하면 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있다.

  • 트리 구조에서 각 노드에 있는 서브트리도 트리다.

  • MenuComponent 추상 클래스를 만든다. 메뉴 구성 요소는 leaf와 복합 노드 모두에서 쓰이는 인터페이스다.

  • 컴포지트 패턴에서는 한 클래스에서 계층 구조를 관리하고 메뉴 관련 작업을 처리하므로 SRP가 깨진다. SRP를 깨는 대신 투명성을 확보한다. 투명성이란, Component 인터페이스에 자식을 관리하는 기능과 leaf로써의 기능을 모두 넣어서 클라이언트가 복합 객체와 leaf를 똑같은 방식으로 처리할 수 있도록 한다. 어떤 원소가 복합 객체인지 leaf인지 클라이언트에게는 투명하게 보인다.

  • 상황에 따라 원칙을 적절하게 사용해야 함을 보여주는 대표 사례라고 할 수 있다.

Last updated