Design Pattern

[디자인 패턴] 이터레이터 패턴 (Iterator Pattern)

꾸준함. 2024. 6. 30. 11:24

이터레이터 패턴

  • 집합 객체 내부 구조를 노출시키지 않으면서 순회하는 방법을 제공하는 패턴
  • 리스트, 배열, 트리와 같은 컬렉션 객체 내부의 요소들에 순차적으로 접근할 수 있도록 하는 디자인 패턴
  • 다양한 컬렉션에 대해 동일한 방식으로 요소들을 탐색할 수 있는 장점을 지님

 

https://www.decipherzone.com/blog-detail/iterator-design-pattern

 

주요 구성 요소

 

1. Iterator

  • 요소들을 순차적으로 접근하기 위한 메서드들을 정의하는 인터페이스
  • 일반적으로 hasNext()와 next() 메서드가 포함

 

2. ConcreteIterator

  • Iterator 인터페이스를 구현체
  • 실제 컬렉션의 요소들을 탐색하는 역할

 

3. Aggregate

  • 컬렉션 객체를 표현하는 인터페이스
  • iterator를 생성하는 메서드 createIterator()를 정의

 

4. ConcreteAggregate

  • Aggregate 인터페이스를 구현하여 특정 컬렉션을 나타내며, 이터레이터를 생성

 

이터레이터 패턴 구현 예시

 

1. Iterator 인터페이스


 

2. ConcreteIterator


 

3. Aggregate 인터페이스

 

 

4. ConcreteAggregate


 

5. 클라이언트 코드

 

 

이터레이터 패턴 장단점

 

장점

  • 이터레이터 패턴은 컬렉션의 순회 방법을 컬렉션 자체와 분리하기 때문에 컬렉션은 요소들을 저장하고 관리하는 역할만 맡으며, 요소들의 순회는 이터레이터 객체가 담당 (SOLID의 SRP 원칙)
  • 새로운 순회 방법을 추가할 때 기존의 컬렉션 클래스를 수정할 필요 없이 새로운 이터레이터 클래스를 추가하면 됨 (SOLID의 OCP 원칙)

 

단점

  • 다른 디자인 패턴들과 마찬가지로 클래스가 늘어남에 따라 관리 포인트가 늘어나고 복잡도 증가

 

실무에서 쓰이는 이터레이터 패턴

 

1. java.util.Iterator

  • 자바 컬렉션 프레임워크에서 이터레이터 패턴을 구현한 대표적인 예
  • 컬렉션의 요소들을 순차적으로 접근할 수 있는 방법을 제공
  • 앞서 작성한 예제와 동일하게 동작

 

Iterator 주요 메서드

  • hasNext(): 컬렉션에 다음 요소가 있는지 확인합니다. 요소가 있으면 true, 없으면 false를 반환
  • next(): 컬렉션의 다음 요소를 반환하며 호출하기 전에 hasNext()를 사용하여 다음 요소가 있는지 확인하는 것이 일반적
  • remove(): 선택적 메서드로 현재 이터레이터 위치에서 요소를 제거
    • 이 메서드는 반복 중 안전하게 요소를 제거할 수 있도록 지원
    • 모든 컬렉션이 해당 메서드를 지원하는 것이 아니기 때문에 호출하기 전 지원 여부 확인 필요

 

2. 스프링 CompositeIterator

  • 여러 개의 이터레이터를 결합하여 하나의 이터레이터로 사용할 수 있게 해주는 클래스
  • 이터레이터 패턴의 변형으로 볼 수 있으며, 여러 이터레이터의 요소들을 순차적으로 접근할 수 있도록 지원
  • 클라이언트는 여러 컬렉션의 요소들을 단일 이터레이터를 통해 일관되게 순회할 수 있음

 

 

참고

코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님

반응형