이터레이터(Iterator) 패턴

2024. 10. 17. 00:48Design Pattern

Iterator 패턴 - 개념과 구현

Iterator 패턴행위 패턴(Behavioral Pattern) 중 하나로, 집합체의 요소들에 순차적으로 접근할 수 있는 방법을 제공하는 디자인 패턴입니다. 이 패턴은 내부 구조를 노출하지 않고도 집합체의 요소들을 순회할 수 있게 해줍니다.


1. Iterator 패턴이란?

Iterator 패턴은 다음과 같은 상황에서 유용합니다:

  • 집합체의 내부 구조를 숨기고, 요소에 접근하는 방법을 제공하고자 할 때.
  • 다양한 집합체를 동일한 방법으로 순회할 수 있도록 하고 싶을 때.
  • 순회하는 방법을 변경하고자 할 때.

2. Iterator 패턴의 구조

Iterator 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:

1. Iterator

  • 집합체의 요소를 순회하는 메서드를 정의하는 인터페이스입니다. Next(), HasNext(), CurrentItem() 등의 메서드를 포함합니다.

2. ConcreteIterator

  • Iterator 인터페이스를 구현하며, 집합체의 요소를 순회하는 구체적인 방법을 제공합니다.

3. Aggregate

  • 집합체를 정의하는 인터페이스로, CreateIterator() 메서드를 포함하여 이터레이터를 생성하는 역할을 합니다.

4. ConcreteAggregate

  • Aggregate 인터페이스를 구현하며, 구체적인 이터레이터를 생성하고 요소들을 관리합니다.

3. Iterator 패턴의 구현 예시 (C#)

// Iterator: 이터레이터 인터페이스
public interface IIterator<T>
{
    T Next();
    bool HasNext();
}

// Aggregate: 집합체 인터페이스
public interface IAggregate<T>
{
    IIterator<T> CreateIterator();
}

// ConcreteIterator: 구체적인 이터레이터
public class ConcreteIterator<T> : IIterator<T>
{
    private readonly ConcreteAggregate<T> _aggregate;
    private int _current = 0;

    public ConcreteIterator(ConcreteAggregate<T> aggregate)
    {
        _aggregate = aggregate;
    }

    public T Next()
    {
        return _aggregate[_current++];
    }

    public bool HasNext()
    {
        return _current < _aggregate.Count;
    }
}

// ConcreteAggregate: 구체적인 집합체
public class ConcreteAggregate<T> : IAggregate<T>
{
    private readonly List<T> _items = new List<T>();

    public void Add(T item)
    {
        _items.Add(item);
    }

    public int Count => _items.Count;

    public T this[int index] => _items[index];

    public IIterator<T> CreateIterator()
    {
        return new ConcreteIterator<T>(this);
    }
}

위의 코드에서 IIterator<T>는 이터레이터 인터페이스이며, IAggregate<T>는 집합체 인터페이스입니다. ConcreteIterator<T>는 구체적인 이터레이터로 집합체의 요소를 순회하고, ConcreteAggregate<T>는 구체적인 집합체로 요소를 관리합니다.

클라이언트 코드

public class Program
{
    public static void Main(string[] args)
    {
        // 집합체 생성
        var aggregate = new ConcreteAggregate<string>();
        aggregate.Add("Item 1");
        aggregate.Add("Item 2");
        aggregate.Add("Item 3");

        // 이터레이터 생성
        var iterator = aggregate.CreateIterator();

        // 요소 순회
        while (iterator.HasNext())
        {
            Console.WriteLine(iterator.Next());
        }
    }
}

클라이언트 코드에서는 ConcreteAggregate<string> 객체를 생성하고, 이터레이터를 생성하여 요소를 순회합니다.


4. Iterator 패턴의 장단점

장점:

  • 구성 요소 캡슐화: 집합체의 내부 구조를 숨기고, 순회하는 방법을 제공하여 코드의 유연성을 높입니다.
  • 다양한 순회 방식: 서로 다른 이터레이터를 사용하여 집합체의 요소를 다양한 방법으로 순회할 수 있습니다.
  • 일관된 인터페이스: 다양한 집합체에 대해 동일한 인터페이스를 통해 순회할 수 있습니다.

단점:

  • 복잡성 증가: 이터레이터와 집합체 클래스 간의 관계로 인해 시스템이 복잡해질 수 있습니다.
  • 성능 오버헤드: 이터레이터 객체를 생성하고 관리하는 데 추가적인 비용이 발생할 수 있습니다.

5. Iterator 패턴의 사용 사례

5.1. 데이터베이스 쿼리 결과

데이터베이스의 쿼리 결과를 순회할 때 이터레이터 패턴을 사용할 수 있습니다.

5.2. UI 컴포넌트

UI 컴포넌트의 리스트를 순회하여 각 컴포넌트를 렌더링할 때 유용합니다.

5.3. 컬렉션 라이브러리

Java, C# 등의 컬렉션 라이브러리에서 이터레이터 패턴을 사용하여 컬렉션의 요소를 순회합니다.


Iterator 패턴은 집합체의 요소에 순차적으로 접근할 수 있는 방법을 제공함으로써, 내부 구조를 숨기고 코드의 유연성을 높여주는 행위 패턴입니다. 이 패턴을 이해하고 적용함으로써, 더 나은 소프트웨어 설계를 할 수 있습니다.