본문 바로가기
까망 동네/디자인 패턴

[디자인 패턴] 반복자 패턴(Iterator Pattern)

by 까망 하르방 2023. 11. 14.
반응형

🎈 반복자 패턴 (Iterator Pattern)

• 컬렉션 요소를 순회하는 방법을 추상화하는 디자인 패턴

• 반복자: 컨테이너의 요소를 가리키다가 약속된 방식으로 열거하는 객체

• 디자인 패턴 중 행위 패턴에 해당

 

💻 디자인 패턴(Design Pattern)이란?

👨‍💻 디자인 패턴(Design Pattern)이란? • SW 개발 방법 중에서도 구조적인 문제 해결에 목적을 둔다. • 알고리즘과 같이 특정 문제를 해결하는 Logic 형태보다는 특정 상황에 적용할 수 있는 방

zoosso.tistory.com

 

 

[예제 코드]

#include <iostream>
#include <vector>

template <typename T>
class Iterator {
public:
    virtual T next() = 0;
    virtual bool hasNext() = 0;
};

template <typename T>
class VectorIterator : public Iterator<T> {
public:
    VectorIterator(std::vector<T>& data) : data(data), index(0) {}

    T next() override {
        return data[index++];
    }

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

private:
    std::vector<T>& data;
    size_t index;
};

int main() {
    std::vector<int> numbers = { 1, 2, 3, 4, 5 };

    VectorIterator<int> it(numbers);

    // 순회
    while (it.hasNext()) {
        int value = it.next();
        std::cout << value << " ";
    }

    std::cout << std::endl;

    return 0;
}

 

반복자 패턴 예시 결과

 

- 벡터를 순회하기 위한 Iterator 정의

- 순회하는 구체적인 Iterator 클래스 정의


 

🎈 반복자 패턴 장단점

+ 분리된 순회 로직

 → 컬렉션 내부 구조와 순회 로직을 분리시킬 수 있다. (낮은 결합도를 통한 유지보수 확장성 up)

+ 순회 동작 캡슐화

 → 클라이언트 코드가 컬렉션 내부 구조에 직접 접근하지 않도록한다.

+ 다양한 순회 방법

 → 순방향, 역방향, 특정 조건 필터링 등

 

- 복잡성 증가

- 추가 오버헤드 발생

 

 

Q) 반복자 패턴을 적용하지 않는다면 어떻게 될까?

배열/컬렉션 크기, 순회 타입/방법 등

대상에 따른 구현이 그때그때 필요하다.

 

 

[예제 코드]

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // 벡터 직접 순회
    for (size_t i = 0; i < numbers.size(); ++i) {
        int value = numbers[i];
        std::cout << value << " ";
    }

    std::cout << std::endl;

    return 0;
}

 

반복자 패턴 예시 결과

 

int 타입에 맞춰서 for문을 구현하였다.

반응형

댓글