반복자 패턴

jelly·2025년 3월 6일

반복자(Iterator) 패턴 개념
반복자(Iterator) 패턴은 컬렉션(리스트, 배열, 트리 등)의 내부 구조를 노출하지 않고 그 요소들을 순차적으로 접근할 수 있도록 하는 디자인 패턴이다. 반복자 패턴을 사용하면 다양한 자료구조를 동일한 방식으로 순회할 수 있어 코드의 유연성이 높아진다.

💡 반복자 패턴의 주요 구성 요소
Iterator (반복자 인터페이스)

컬렉션 요소를 순회하는 방법을 정의한다.
next(), hasNext() 등의 메서드를 제공한다.
Concrete Iterator (구체적 반복자)

실제로 컬렉션을 순회하며 Iterator 인터페이스를 구현한다.
Aggregate (집합체 인터페이스)

컬렉션을 표현하는 인터페이스.
createIterator() 메서드를 통해 반복자를 생성한다.
Concrete Aggregate (구체적 집합체)

컬렉션 데이터를 저장하고 관리하며, Iterator 객체를 생성한다.
C++ 예제 코드
아래 예제에서는 Iterator 패턴을 활용하여 NumberCollection 클래스를 순회하는 반복자를 구현한

#include <iostream>
#include <vector>

// 1. Iterator 인터페이스 정의
class Iterator {
public:
    virtual bool hasNext() = 0;
    virtual int next() = 0;
    virtual ~Iterator() {}
};

// 2. Concrete Iterator (구체적 반복자)
class NumberIterator : public Iterator {
private:
    std::vector<int> data;
    size_t index;

public:
    NumberIterator(const std::vector<int>& numbers) : data(numbers), index(0) {}

    bool hasNext() override {
        return index < data.size();
    }

    int next() override {
        return hasNext() ? data[index++] : -1;  // -1은 예외 처리 대체
    }
};

// 3. Aggregate 인터페이스 정의
class IterableCollection {
public:
    virtual Iterator* createIterator() = 0;
    virtual ~IterableCollection() {}
};

// 4. Concrete Aggregate (구체적 집합체)
class NumberCollection : public IterableCollection {
private:
    std::vector<int> numbers;

public:
    void add(int number) {
        numbers.push_back(number);
    }

    Iterator* createIterator() override {
        return new NumberIterator(numbers);
    }
};

// 5. 사용 예제
int main() {
    NumberCollection collection;
    collection.add(1);
    collection.add(2);
    collection.add(3);
    collection.add(4);
    
    Iterator* iterator = collection.createIterator();

    while (iterator->hasNext()) {
        std::cout << iterator->next() << " ";
    }

    delete iterator;  // 동적 할당 해제
    return 0;
}
profile
jelly

0개의 댓글