이터레이터(Iterator) 패턴
2024. 10. 17. 00:48ㆍDesign 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 패턴은 집합체의 요소에 순차적으로 접근할 수 있는 방법을 제공함으로써, 내부 구조를 숨기고 코드의 유연성을 높여주는 행위 패턴입니다. 이 패턴을 이해하고 적용함으로써, 더 나은 소프트웨어 설계를 할 수 있습니다.
'Design Pattern' 카테고리의 다른 글
안티 패턴(Anti-Pattern) - 잘못된 디자인 패턴 사용의 예와 피해야 할 패턴들 (1) | 2024.10.18 |
---|---|
중재자(Mediator) 패턴 (1) | 2024.10.17 |
커맨드(Command) 패턴 (0) | 2024.10.17 |
브릿지(Bridge) 패턴 (0) | 2024.10.17 |
프록시(Proxy) 패턴 (0) | 2024.10.17 |