[Design Pattern] 반복자 패턴 (Iterator Pattern)

2025. 4. 7. 23:38·Design Pattern

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
'Design Pattern' 카테고리의 다른 글
  • [Design Pattern] 어댑터 패턴 (Adapter Pattern)
  • [Design Pattern] 팩토리 패턴 (Factory Pattern)
  • [Design Pattern] 템플릿 메서드
  • [Design Pattern] 상태 패턴 (State Pattern)
DevColIn
DevColIn
복잡함을 단순하게
  • DevColIn
    심플한 코딩생활
    복잡함을 단순하게
  • 전체
    오늘
    어제
    • 전체보기 (223)
      • Unreal 부트캠프 (49)
        • TIL (34)
        • 사전캠프 (7)
        • 본캠프 (8)
      • Unrael (10)
        • 환경설정 (0)
        • Basic (19)
        • Component (5)
        • GAS (GameplayAbilitySystem) (3)
        • AI (2)
        • Implement (10)
        • UI (1)
        • Error (1)
        • Network (2)
        • Tip (1)
      • Level Design (5)
      • Math (1)
      • Design Pattern (16)
      • Computer Science (2)
        • Network (1)
        • Database (1)
      • Algorithm (79)
        • Basic (4)
        • Practice (74)
      • C++ (4)
        • Basic (4)
      • Tool (0)
      • Game (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    액터
    assetmanager
    디자인패턴
    알고리즘
    내일배움캠프
    소프트 레퍼런신
    unreal
    actor
    Implement
    Design Pattern
    KPT회고
    Algorithm
    AI
    unrealengine
    component
    하드 레퍼런싱
    본캠프
    tsoftobjectptr
    basic
    퀘스트
    DesignPattern
    c++
    gas
    게임동기화
    사전캠프
    Til
    디자인 패턴
    GameplayEffect
    Animation
    레벨디자인
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
DevColIn
[Design Pattern] 반복자 패턴 (Iterator Pattern)
상단으로

티스토리툴바