상세 컨텐츠

본문 제목

이터레이터 패턴 (Iterator Pattern)

프로그래밍 관련/패턴

by AlrepondTech 2010. 3. 26. 14:27

본문

반응형

낭만님의 구현 : http://thx4alice.tistory.com/333


이터레이터 패턴은 이미 제네릭 프로그래밍에서 널리 사용되고 있는 패턴입니다. (= 반복자 패턴)
이번에는 직접 구현을 해보았습니다.

100% 똑같이 구현하지는 못했지만,
이터레이터라는게 무엇인지는 확실히 알게될 듯 하네요.

이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서도
그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해줍니다.
1/*
2    Common.h
3*/
4 
5#include <iostream>
6 
7#include "Iterator.h"
8 
9using namespace std;

01/*
02    Iterator.h
03*/
04 
05#pragma once
06 
07template <class T>
08class Iterator
09{
10public:
11    virtual bool hasNext() = 0;
12    virtual T* next() = 0;
13};
14 
15template <class U>
16class Aggregate
17{
18public:
19    virtual Iterator<U>* createIterator() = 0;
20};
21 
22/*
23    여기까지는 Iterator, Aggregate 인터페이스 정의
24    아래부터는 이 인터페이스를 구현
25*/
26 
27class Book
28{
29private:
30    char* name;
31 
32public:
33    void setName(char* name);
34    char* getName();
35};
36 
37class BookIterator : public Iterator<Book>
38{
39private:
40    Book* books;
41    int position;
42    int maxBooks;
43 
44public:
45    BookIterator(Book* books, int maxBooks)
46        : books(books), position(0), maxBooks(maxBooks)
47    { }
48 
49    bool hasNext();
50    Book* next();
51};
52 
53class EastBookStore : public Aggregate<Book>
54{
55private:
56    static const int maxBooks = 3;
57    Book books[maxBooks];
58 
59public:
60    EastBookStore();
61 
62    Iterator<Book>* createIterator();
63};
64 
65class WestBookStore : public Aggregate<Book>
66{
67private:
68    static const int maxBooks = 4;
69    Book books[maxBooks];
70 
71public:
72    WestBookStore();
73 
74    Iterator<Book>* createIterator();
75};
76 
77class BookMaster
78{
79private:
80    Aggregate<Book> *eastBookStore;
81    Aggregate<Book> *westBookStore;
82 
83public:
84    BookMaster(Aggregate<Book> *eastBookStore, Aggregate<Book> *westBookStore)
85        : eastBookStore(eastBookStore), westBookStore(westBookStore)
86    { }
87 
88    void ShowBookList();
89};

01/*
02    Iterator.cpp
03*/
04 
05#include "Common.h"
06 
07void Book::setName(char* name)
08{
09    this->name = name;
10}
11 
12char* Book::getName()
13{
14    return name;
15}
16 
17bool BookIterator::hasNext()
18{      
19    if( position == maxBooks )
20        return false;
21    else
22        return true;
23}
24 
25Book* BookIterator::next()
26{
27    Book *nextBook = &books[position++];
28    return nextBook;
29}
30 
31EastBookStore::EastBookStore()
32{
33    books[0].setName("혼자 연구하는 C/C++");
34    books[1].setName("Programming Windows");
35    books[2].setName("WPF Unleashed");
36}
37 
38Iterator<Book>* EastBookStore::createIterator()
39{
40    return new BookIterator(books, maxBooks);
41}
42 
43WestBookStore::WestBookStore()
44{
45    books[0].setName("해변의 카프카");
46    books[1].setName("전도서에 바치는 장미");
47    books[2].setName("바람의 열두방향");
48    books[3].setName("내 눈에는 악마가");
49}
50 
51Iterator<Book>* WestBookStore::createIterator()
52{
53    return new BookIterator(books, maxBooks);
54}
55 
56void BookMaster::ShowBookList()
57{
58    Iterator<Book> *eastBookIterator = eastBookStore->createIterator();
59    Iterator<Book> *westBookIterator = westBookStore->createIterator();
60 
61    while( eastBookIterator->hasNext() )
62    {
63        Book *book = eastBookIterator->next();
64        printf"EastBookStore's Book : %s \n", book->getName() );
65    }
66 
67    printf"--------------------------------------- \n" );
68 
69    while( westBookIterator->hasNext() )
70    {
71        Book *book = westBookIterator->next();
72        printf"WestBookStore's Book : %s \n", book->getName() );
73    }
74 
75    printf"--------------------------------------- \n" );
76}

01/*
02    Main.cpp
03*/
04 
05#include "Common.h"
06 
07void main()
08{
09    EastBookStore *eastBookStore = new EastBookStore();
10    WestBookStore *westBookStore = new WestBookStore();
11 
12    BookMaster bookMaster(eastBookStore, westBookStore);
13    bookMaster.ShowBookList(); 
14}



hasNext, next 밖에 없는 허접 이터레이터군요 --;;; 

이터레이터 패턴

이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서도
그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해줍니다.



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

http://ingenuity.egloos.com/1789738

for (int i = 0; i < arr.length; i++) {

  System.out.println(arr[i]);

}

위와 같이 차례차례 검색하려면 우리가 아는 자료 구조와 for 문을 사용해서 하는 방법이 있다.
또 한 가지 방법은 자바의 한 컬렉션 형태 중 하나인 Iterator(이터레이터)를 사용하는 방법이 있다.
왜 굳이 디자인 패턴에서는 이 방법을 사용하는 것을 제안하는 것일까?

Array, Vector, Linked List 등 여러 자료 구조가 있는데 이것들은 저마다 구현하는 방법이 다르다.
만약 처음에는 Array로 구현했는데 나중에 Vector로 바꿔야 하는 일이 생겨버렸다. 이렇게 되면 소스의 많은 부분을 뜯어 고쳐야 하는 불상사가 생기게 되어버린다.

만약 자료 구조는 어떤 걸로 구현하든 상관없이 프로그래밍을 할 수 있다면 나중에 수고가 덜하겠지?
Iterator는 바로 이럴 때 사용하는 디자인 패턴이다.

이터레이터 패턴에서 가장 먼저 알아야 할 것은 바로 인터페이스에 의존한다는 점이다.
일단 인터페이스가 있으면 배열, 리스트, 해시테이블은 물론, 그 어떤 종류의 객체 컬렉션에 대해서도 반복자를 구현 할 수 있다.
정리하자면, 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근 할 수 있게 해주는 방법을 제공해준다.
또한, 각 항목에 일일이 접근할 수 있게 해주는 기능을 집합체가 아닌 반복자 객체에서 책임지게 된다는 것도 장점으로 작용한다. 그러면 집합체 인터페이스 및 구현이 간단해지고, 각자 중요한 일만 잘 처리할 수 있으면 된다.


반응형

'프로그래밍 관련 > 패턴' 카테고리의 다른 글

팩토리 패턴  (0) 2010.04.28
상태 패턴  (0) 2010.03.26


관련글 더보기

댓글 영역