영권's

디자인 패턴(Behavioral) - Iterator 본문

스터디/디자인 패턴

디자인 패턴(Behavioral) - Iterator

ykkkk 2021. 8. 13. 03:15

Iterator 패턴이란?

내부 표현 방법을 노출하지 않고 집합체(리스트, 스택, 트리 등)의 원소를 순차적으로 접근할 수 있는 방법을 제공하는 패턴

 

컬렉션은 프로그래밍에서 가장 많이 사용되는 데이터 유형중 하나인데 객체를 담을 수 있는 컨테이너입니다.

어떤 요소를 리스트, 스택, 트리 등 다양한 데이터 구조를 기반으로 한 컨테이너에 담을 수 있습니다.

 

하지만 컬렉션이 어떻게 구조화되든 간에 다른 코드가 이러한 요소를 사용할 수 있도록 해당 요소에 접근할 수 있는 방법을 제공해야 합니다.

하나의 요소에 계속 접근하는 것이 아닌 컬렉션의 요소를 순차적으로 접근하는 방법이 있어야 합니다.

리스트 형태를 기반한 컬렉션은 이 작업이 쉽울수 있지만, 트리나 다른 형태의 컨테이너에서는 쉽지 않을 수 있습니다.

 

그러나 사용자들은 편리하고 쉽게 자료를 순회하거나, 특정 자료를 검색하기를 원합니다.

단순히 데이터를 가져올 때에도 자료구조에 대해 각자 다른 방식으로 접근해야 하는 불편함이 있습니다.

 

그래서 iterator 패턴의 주요 개념은 컬렉션을 단순히 반복할 수 있는 기능을 제공하는 것입니다.

 

 

Iterator 패턴 클래스 다이어그램

  • Iterator 역할
    • 요소를 순서대로 검색해가는 인터페이스(API)를 결정합니다.
  • ConcreteIterator(구체적인 반복자)의 역할
    • Iterator가 결정한 인터페이스를 실제로 구현합니다.
  • Aggregate(집합체) 역할
    • Iterator 역할을 만들어내는 인터페이스를 결정합니다.
    • 이 인터페이스는 '내가 가지고 있는 요소를 순서대로 검색해 주는 사람'을 만들어내는 메서드 입니다.
  • ConcreteAggregate(구체화된 집합체) 역할
    • Aggregate 역할이 결정한 인터페이스를 실제로 구현하는 일을 합니다.(ConcreteIterator 역할의 인스턴스를 만들어 냅니다.)

 

적용가능성

  • 컬렉션의 복잡한 데이터 구조를 편의상 또는 보안상의 이유로 클라이언트로부터 숨기려는 경우 Iterator패턴을 사용할 수 있습니다.
    • iterator는 복잡한 데이터 구조 작업에 대해서 세부 정보를 캡슐화하여 클라이언트에게 컬렉션의 요소에 접근하는 간단한 방법을 제공합니다.
    • 이렇게 하게 되면 클라이언트는 매우 편리하게 데이터 접근을 할 수 있고 직접 데이터 접근을 했을 경우, 부주의하거나 악의적인 작업으로 부터 데이터를 보호할 수 있습니다.
  • Iterator 패턴을 사용해서 요소에 접근하는 중복코드를 줄일 수 있습니다.
    • 사소한 반복 알고리즘의 코드로 매우 부피가 커질 수 있습니다.
    • 앱의 비즈니스 로직에 배치될 경우 원래 코드의 본질이 모호해지고 유지보수가 어려워질 수 있습니다.
    • 데이터에 접근하는 코드를 Iterator를 이용하면 코드를 보다 깔끔하게 만들 수 있습니다.
  • 서로 다른 데이터 구조를 접근하거나 이러한 구조의 유형을 미리 알 수 없는 경우 Iterator를 사용합니다.

 

장점

  • 단일 책임 원칙(Single Responsibility Principle)
    • 요소 접근 알고리즘을 기존 클라이언트 코드에서 추출하여 클라이언트 코드를 정리할 수 있습니다.
  • 개방/폐쇄 원칙(Open/Closed Principle)
    • 새로운 유형의 컬렉션 및 Iterator를 구현하여 기존 코드를 손상시키지 않고 기존 코드로 전달할 수 있습니다.
  • 각각의 Iterater 개체는 자체 반복 상태가 포함되어 있으므로 동일한 컬렉션에 대해서 병렬로 반복할 수 있습니다.
  • 같은 이유로 반복을 지연하고 필요할 대 계속 할 수 있습니다.

 

단점

  • 만약 앱이 단순한 컬렉션만으로만 동작한다면 패턴을 적용했을 때 오히려 효과를 떨어뜨릴 수 있습니다.
  • 반복기를 사용하는 것이 일부 전문 컬렉션의 요소를 직접 통과하는 것보다 효율적이지 않을 수 있습니다.

 

Iterator 예제코드

 

이름 설명
Aggregate 집합체를 나타내는 인터페이스
Iterator 하나씩 나열하면서 검색을 실행하는 인터페이스
Book 책을 나타내는 클래스
BookShelf 서가를 나타내는 클래스
BookShelfIterator 서가를 검색하는 클래스

Comments