본문 바로가기

Design/Design Pattern

[Design Pattern] Iterator Pattern

이번 장에서는 이터레이터(Interator) 패턴에 대해서 알아본다.
샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다.


이터레이터 패턴이란?
위키백과에 따른 정의는 아래와 같다.

반복자를 사용하여 컨테이너를 가로지르며 컨테이너의 요소들에 접근하는 디자인 패턴.
반복자 패턴은 컨테이너로부터 알고리즘을 분리시키며, 일부의 경우 알고리즘들은 필수적으로 컨테이너에 특화되어 있기 때문에 불가능하다.
반복자 패턴의 본질은 기반이 되는 표현을 노출시키지 않고 연속적으로 객체 요소에 접근하는 방법을 제공하는 것이다.
다시말해 aggregate 유형에 무관한 동일 순차 접근 방법을 제공하는 것이며, 여기서 aggregate란 반복자 객체를 생성하기 위한
인터페이스를 정의하는 것이고 iterator란 요소에 접근 할 수 있고 순회 할 수 있는 인터페이스를 정의하는 것이다.

한 마디로 어떤 자료구조(List, Array 등)에 객체들이 담겨있더라도 동일한 방식으로 순회할 수 있게 만들어야 한다는 것이다.

이번에는 Streaming Service를 통해서 예를 들어볼 것이다.
대표적인 Streaming Service로는 Netflix, Wavve, Tving이 있으며
사용자는 각 서비스들을 통해서 오징어 게임을 시청할 것이다.
하지만 Netflix는 Array로 Wavve는 List로 Tving은 Set을 통해 오징어 게임 시즌을 관리하고 있다.
이러한 상황에서 이터레이터 패턴을 사용하여 사용자들은 서비스들이 어떤 자료구조로 서비스를 제공하던 영상을 재생시키도록 할 것이다.


GoF Design Patterns에 따르면 아래와 같은 Class Diagram이 그려진다.

Aggregate: Iterator 객체를 생성하기 위한 메서드를 명시한 인터페이스.
ConcreteAggregate: Aggregate의 구현체로 Iterator 객체를 생성하는 역할을 한다.
Iterator: 반복 가능한 객체를 만들어내기 위한 기능을 명시한 인터페이스.
ConcreteIterator: 반복 가능한 객체를 만들어내는 구현체.

위의 그림을 Streaming Service에 적용시키면 아래와 같은 그림이 그려진다.

Aggregate 인터페이스 역할을 하는 StreamingService 인터페이스가 있다.
이를 구현하며 ConcreteAggregate 역할을 하는 Netflix, Tving, Wavve가 있다.
SquidGameSeason은 순회가 가능하도록 java.util의 Iterator를 구현하고 있으며 Netflix, Tving, Wavve에 의해 생성된다.


코드를 보면서 하나씩 살펴보도록 한다.

SquidGame Class
오징어 게임 영상 역할을 하는 클래스.

SquidGameSeason Class
오징어 게임 하나의 시즌 역할을 하는 클래스.
영상 배열을 가지고 있으며 다음 영상을 재생하기 위한 next 메서드를 구현하고 있다.

StreamingService Interface
오징어 게임의 시즌을 가져오기 위한 메서드를 명시하고 있다.

Netflix, Tving, Wavve Class
StreamingService의 구현체로 각각 Netflix는 Array, Tving은 Set, Wavve는 List를 사용하여 영상을 관리하고 있다.

User Class
Streaming Service를 사용하여 오징어게임을 감상하는 사용자 클래스.
여기서 중요하게 봐야하는 점은 Streaming Service들은 영상을 각각 다른 자료구조로 관리하고 있지만
이를 시청하는 시청자는 관리방식을 알지도 못하고 알필요도 없다는 점이다.
모든 서비스를 시청할 때 같은 방식으로 시청한다는 점이 핵심 포인트다.

코드를 실행시킨 결과는 아래와 같다.


지금까지 스트리밍 서비스들을 이터레이터 패턴에 적용해서 살펴보았다.

'Design > Design Pattern' 카테고리의 다른 글

[Design Pattern] Interpreter Pattern  (0) 2022.02.06
[Design Pattern] Command Pattern  (0) 2022.02.06
[Design Pattern] Flyweight Pattern  (0) 2022.02.04
[Design Pattern] Memento Pattern  (0) 2022.02.03
[Design Pattern] State Pattern  (0) 2022.02.03