본문 바로가기
Design Pattern

[Design Pattern] 반복자 패턴(Iterator Pattern)에 대해 알아보자

by 개발자J의일상 2022. 7. 16.
반응형

Definition

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

이 패턴을 사용하면 집합체 내에서 어떤 식으로 일이 처리되는지 전혀 모르는 상태에서 그 안에 들어있는 모든 항목을 대상으로 반복 작업을 수행할 수 있다.

Cursor라고도 알려짐

Behavioral Pattern

Situation

- 자료구조에 상관없이 객체 접근 방식을 통일하고자 할때

- 컬렉션의 내부에 복잡한 데이터 구조가 있지만 그 복잡성을 클라이언트로 부터 숨기고 싶은 경우(편의 또는 보안상의 이유로 Iterator 패턴을 사용하라)

- 앱 전체에서 순회 코드의 중복을 줄이기 위해 (순회 코드를 지정된 반복자로 이동하면 애플리케이션 코드를 보다 간결하고 깔끔하게 만들 수 있다)

- 코드가 다른 데이터 구조를 순회할 수 있기를 원하거나 이러한 구조의 유형을 미리 알 수 없는 경우

Structure

Pros

- 각 항목에 일일이 접근할 수 있게 해주는 기능을 집합체가 아닌 반복자 객체가 책임진다. 이렇게 하면, 집합체의 인터페이스 및 구현이 간단해질 뿐만 아니라, 집합체에서는 반복 작업을 수행하지 않고 원래 자신이 할 일에만 전념할 수 있다.

- 집합체 인터페이스와 구현이 간단해지고 각자에게 중요한 일만을 처리할 수 있게 된다.

- 단일 책임 원칙 (Single Responsibility Principle) 부피가 큰 순회 알고리즘을 별도의 클래스로 추출하여 클라이언트 코드와 컬렉션을 정리할 수 있다.

- 개방/폐쇄 원칙 (Open/Closed Principle) 새로운 유형의 컬렉션 및 반복자를 구현하고 아무 것도 손상시키지 않고 기존 코드에 전달할 수 있다.

- 각 반복자 객체에는 고유한 반복 상태가 포함되어 있으므로 동일한 컬렉션을 병렬처리할 수 있다.

Cons

- 앱이 간단한 컬렉션에서만 작동하는 경우(단순한 순회를 구현하는 경우) 패턴을 적용하는 것은 복잡도만 증가할 수 있다. 

- 반복자를 사용하는 것은 컬렉션에서 특정 위치의 요소에 바로 접근해야 할 때 비효율적일 수 있다.

 

비슷한 패턴

- Iterator를 사용하여 Composite 트리를 탐색할 수 있습니다.

- Iterator와 함께 Factory Method를 사용하여 컬렉션 하위 클래스가 컬렉션과 호환되는 다양한 유형의 반복자를 반환하도록 할 수 있다.

- 다형성 Iterator는 적절한 Iterator 하위 클래스를 인스턴스화하기 위해 Factory Method에 의존한다.

- MementoIterator와 함께 사용하여 현재 반복 상태를 캡처하고 필요한 경우 롤백할 수 있다.

- VisitorIterator와 함께 사용하여 복잡한 데이터 구조를 순회하고 요소가 모두 다른 클래스를 갖고 있더라도 해당 요소에 대해 일부 작업을 실행할 수 있다.

 

기타

응집도(cohesion)란 한 클래스 또는 모듈이 특정 목적이나 역할을 얼마나 일관되게 지원하는지를 나타내는 척도이다.

응집도가 높다는 것은 서로 연관된 기능이 묶여 있다는 것을, 응집도가 낮다는 것은 서로 상관없는 기능들이 묶여있다는 것이다.

단일 책임 원칙

어떤 클래스를 변경해야 하는 이유는 하나뿐이어야 한다. 하나의 객체는 반드시 하나의 동작만의 책임을 갖는다.

 

https://refactoring.guru/design-patterns/template-method
헤드 퍼스트 디자인 패턴 개정판 - 에릭 프리먼, 엘리자베스 롭슨
300x250

댓글