본문 바로가기
CS

[디자인패턴] 반복자 (Iterator) 패턴의 개념 및 구조 요약정리

by Warehaus 2022. 8. 18.

 

목적

- 객체들의 집합에 저장되어 있는 자료형과 관계없이 동일한 인터페이스를 이용한 접근

- 외부에 타입을 노출하지 않으면서 내부 요소에 접근이 필요한 경우, 자료구조 변경에 영향 없이 Item에 접근 가능

 

Use when

- 객체 내용을 알지 못하더라도 각 요소에 접근이 필요할 때

- 개체에 대한 순회가 필요한 경우

- 개체 순방을 위한 정형화된 인터페이스가 필요한 경우

 

구조 및 구성요소

 

 

- Client : Aggregate 객체를 생성하고 생성 된 ConcreateAggregate 객체로 부터 Iterator 를 받는다.

 

- Aggregate : Client에서 사용되는 인터페이스로 ConcreateAggregate 의 인터페이스 입니다.

 

- ConcreteAggreate : 실제 Client에서 접근하고자 하는 객체, createIterator 메서드를 통해 Client에게 Iterator를 전달합니다.

 

- Iterator : Client가 Aggregate 객체를 순방하기 위한 인터페이스

 

- ConcreteIterator : ConcreteAggregate가 iterator를 Client에 전달할 때 생성되는 객체.

 

간단히 구조를 풀어서 설명하면, Iterator를 사용하기 위해서 Client 는 ConcreateAggregate 객체를 가지고 있어야 하며, createIterator 메서드를 통해 ConcreateAggregate 에서 생성되는 Iterator를 전달받습니다.   이 때 전달은 생성 된 Iterator를 리턴 받음을 의미합니다.

 

대충 아래와 같은 느낌으로요.

 

Iterator = ConcreteAggregat.createIterator();

 

Iterator를 갖게 된 Client는 이제 hasNext, next메서드 사용이 가능해지며, 이를 통해서 ConcreteAggregate 의 객체를 순방(traverse)할 수 있게 됩니다.

 

어떻게 그렇게 되나면요, ConcreteAggregate 가 Iterator를 생성할 때, 자신이 가진 Array든..  List든.. 아무튼 가지고 있는 데이터들을 Iterator에 담아서 주기 때문입니다. Iterator는 생성 시점에 이 정보들을 설정하고 생성되기 때문에, Client는 Iterator만으로도 ConcreteAggregate 객체 내부의 정보들을 순방 할 수 있게 됩니다.

 

 

관련패턴

반복자 패턴과 연관 된 패턴은 다음과 같습니다.

 

- Composite : Iterator가 순방할 대상이 되는 패턴

- Visitor : Composite 순방을 위한 Operation 에 적용 가능한 패턴

- Mementor : Iterator  의 상태를 저장하는 패턴

- Factory Method : Iterator를 생성하기 위해 사용 가능한 패턴

 

 

객체지향 원칙

Iterator 는 객체지향 원칙 중 SRP( Single Responsibility Principle ) 을 만족시키는 패턴입니다.

즉, 탐색이라는 단일 책임을 부여한다는 것을 의미합니다.

 

기본적으로 내부에 데이터를 포함하는 객체를 생성 시 우리는 Composite 패턴을 사용하게 되는데, 은연 중에 탐색에 대한 책임을 부여하게 됩니다. 

 

이런 탐색에 대한 책임을 Iterator로 분리함으로써, 조금 더 SRP 를 준수하는 방향으로 설계가 가능해 집니다.