1. 반복자 패턴 (Iterator Pattern)
리스트, 스택, 트리, 그래프 등을 컬렉션(Collection)이라고 한다.
반복자 패턴은 컬렉션을 외부에 노출하지 않고, 컬렉션의 요소들을 하나씩 순회할 수 있도록 하는 행동 디자인 패턴이다.
2. 문제 상황 (Why Iterator?)
컬렉션마다 순회하는 로직이 다를 수 있다.
로직에서 컬렉션을 변경할 때 순회하는 로직이 다르기에 코드가 함께 수정되어야 한다.
3. 해결 방안
반복자 패턴을 사용하여
컬렉션 종류에 상관없이 순회 가능한 로직을 외부에 제공한다.
4. 반복자 패턴 클래스 구조

- 반복자 인터페이스 (IIterator)
- 외부에 호출될 함수를 정리한다.
- 순회를 하기 위해 HasNext() 다음 값이 있는지, Next() 다음 값으로 이동하는 함수를 가상함수로 선언한다.
- 인벤토리 반복자 (InventoryIterator)
- 반복자 인터페이스를 구현한 클래스이다.
- 인벤토리의 컬렉션에 접근할 수 있다.
- 외부에 컬렉션 요소를 반환한다.
- 집합체 인터페이스(IAggregate)
- 반복자를 반환하는 인터페이스이다.
- 인벤토리 (Inventory)
- 집합체 인터페이스를 구현한 클래스이다.
- 인터페이스 구현을 통해 반복자를 반환한다.
반복자 인터페이스
public interface IIterator<T>
{
bool HasNext();
T Next();
}
컬렉션 인터페이스
public interface IAggregate<T>
{
IIterator<T> CreateIterator();
}
인벤토리
public class Inventory : IAggregate<Item>
{
private Item[] _items;
private int _last = 0; // 실제로 추가된 아이템 개수
public Inventory(int size)
{
_items = new Item[size];
}
public void AddItem(Item item)
{
if (_last < _items.Length)
{
_items[_last] = item;
_last++;
}
else
{
Console.WriteLine("인벤토리가 가득 찼습니다.");
}
}
public Item GetItemAt(int index)
{
if (index < 0 || index >= _last) return null;
return _items[index];
}
public int Count
{
get { return _last; }
}
public IIterator<Item> CreateIterator()
{
return new InventoryIterator(this);
// 자신(Inventory)에 맞는 반복자를 생성해 반환
}
}
인벤토리 반복자
public class InventoryIterator : IIterator<Item>
{
private Inventory _inventory;
private int _currentIndex = 0;
public InventoryIterator(Inventory inventory)
{
_inventory = inventory;
}
public bool HasNext()
{
return _currentIndex < _inventory.Count;
}
public Item Next()
{
Item item = _inventory.GetItemAt(_currentIndex);
_currentIndex++;
return item;
}
}
사용 예시
class Program
{
static void Main(string[] args)
{
// 1) 인벤토리 생성
Inventory inventory = new Inventory(5);
// 2) 아이템 추가
inventory.AddItem(new Item("Sword", 10));
inventory.AddItem(new Item("Shield", 5));
inventory.AddItem(new Item("Potion", 1));
// 3) 반복자 받아오기
IIterator<Item> it = inventory.CreateIterator();
// 4) 순회(Traversal)
while (it.HasNext())
{
Item current = it.Next();
Console.WriteLine($"아이템: {current.Name}, 무게: {current.Weight}");
}
}
}
// 간단한 Item 클래스 예시
public class Item
{
public string Name { get; }
public int Weight { get; }
public Item(string name, int weight)
{
Name = name;
Weight = weight;
}
}
실행 결과
아이템: Sword, 무게: 10
아이템: Shield, 무게: 5
아이템: Potion, 무게: 1'Design Pattern' 카테고리의 다른 글
| [Design Pattern] 어댑터 패턴 (Adapter Pattern) (0) | 2025.04.09 |
|---|---|
| [Design Pattern] 팩토리 패턴 (Factory Pattern) (0) | 2025.04.08 |
| [Design Pattern] 템플릿 메서드 (0) | 2025.04.04 |
| [Design Pattern] 상태 패턴 (State Pattern) (0) | 2025.04.03 |
| [Design Pattern] 전략 패턴 (0) | 2025.04.02 |