코드/GOF

디자인 패턴 - 행위(Behavioral) 패턴 (5) 반복자 패턴(Iterator Pattern)

미로처럼 2024. 3. 18. 14:09
728x90

일련의 데이터 집합에 대하여 순차적인 접근(순회)을 지원하는 패턴

 

구조

 

Aggregate (인터페이스)

  • ConcretateIterator 객체를 반환하는 인터페이스를 제공.
    • Iterator() - ConcreateIterator 객체를 만드는 팩토리 메서드

 

ConcreateAggregate (클래스)

  • 여러 요소들이 이루어져 있는 데이터 집합체

 

Iterator (인터페이스)

  • 집합체 내의 요소들을 순서대로 검색하기 위한 인터페이스를 제공한다.
    • hasNex() - 순회할 다음 요소가 있는지 확인( true / false)
    • next() - 요소를 반환하고 다음 요소를 반환할 준비를 하기 위해 커서를 이동시킴

 

ConcreateIterator(클래스)

  • 반복자 객체
    • ConcreateAggregate가 구현한 메서드로부터 생성되며, ConcreateAggregate의 컬렉션을 참조하여 순회한다.
    • 어떤 전략으로 순회할지에 대한 로직을 구체화 한다.

 

특징

 

사용시기

  • 컬렉션에 상관없이 객체 접근 순회 방식을 통일하고자 할 때
  • 컬렉션을 순회하는 다양한 방법을 지원하고 싶을 때
  • 컬렉션의 복잡한 내부 구조를 클라이언트로 부터 숨기고 싶은 경우(편의 + 보안)
  • 데이터 저장 컬렉션 종류가 변경 가능성이 있을 때
    • 클라이언트가 집합 객체 내부 표현 방식을 알고 있다면, 표현 방식이 달라지면 클라이언트 코드도 변경되어야 하는 문제가 생긴다.

 

 

장점

  • 일관된 이터레이터 인터페이스를 사용해 여러 형태의 컬렉션에 대해 동일한 순회 방법을 제공한다.
  • 컬렉션의 내부 구조 및 순회 방식을 알지 않아도 된다.
  • 집합체의 구현과 접근하는 처리 부분을 반복자 객체로 분리해 결합도를 줄 일 수 있다.
    • Client에서 iterator로 접근하기 때문에 ConcreteAggregate 내에 수정사항이 생겨도 iterator에 문제가 없다면 문제가 발생하지 않는다
  • 순회 알고리즘을 별도의 반복자 객체에 추출하여 각 클래스의 책임을 분리하여 단일 책임 원칙(SRP)를 준수한다.
  • 데이터 저장 컬렉션 종류가 변경되어도 클라이언트 구현 코드는 손상되지 않아 수정에는 닫혀 있어 개방 폐쇄 원칙(OCP)를 준수한다.

 

단점

  • 클래스가 늘어나고 복잡도가 증가한다.
    • 만일 앱이 간단한 컬렉션에서만 작동하는 경우 패턴을 적용하는 것은 복잡도만 증가할 수 있다.
    • 이터레이터 객체를 만드는 것이 유용한 상황인지 판단할 필요가 있다.
  • 구현 방법에 따라 캡슐화를 위배할 수 있다.

 

728x90