본문 바로가기

Design Pattern

[Design pattern] 반복자 Iterator

패턴

- 반복자(Iterator)

 

다른 이름

- 커서(Cursor)

 

키워드

- 반복적인 행동의 일반화

 

의도

- 내부 표현부를 노출하지 않고 어떤 집합 객체에 속한 원소들을 순차적으로 접근할 있는 방밥을 제공한다.

 

동기

1. 리스트(list) 집합 객체들은 내부 표현 구조를 노출하지 않고도 자신의 원소를 접근할 있는 방법을 제공하는 좋다.

2. 이미 정의한 방법과 다른 방법으로 이들 원소들을 순회하고자 수도 있다.

3. 순회 방법이 바뀌었다고 List 클래스의 인터페이스를 부풀리고 싶지는 않다.

4. 동일한 리스트에 대해서 하나 이상의 순회 방법을 정의하고 싶을 때도 있다.

 

패턴소개

1. 동기에서 나타난 문제들을 해결할 있는 것이, 반복자 패턴이다.

2. 패턴은 리스트 객체에 접근해서 새로운 내용을 삽입, 삭제하거나 순회하는 내용을 반복자 객체에 정의하는 이다.

3. 반복자 객체를 나타내는 Iterator클래스는 리스트의 원소들에 접근하는 인터페이스를 제공한다. 객체는 현재 원소가 무엇인지 관리하고, 이미 방문한 원소들이 무엇인지 알고 있다.

 

4. List 클래스와 ListIterator 클래스의 연관성.

  

1) ListIterator 클래스의 인터페이스를 생성하기 전에 먼저 순회 주체가 되는 List객체를 생성해야 한다.

2) 다형성을 지닌 반복이 가능하도록 만든다.

- Iterator 클래스와 List 클래스가 한쌍으로 묶여 있어, 순회 주체가 어떤 집합 구조에 대해서 순회할 주체가 리스트인지 알아야 한다. 이때 List 복합 구조를 변경하더라도 사용자 코드는 변경하지 않도록 하는 것이 좋다.

3) 공통의 인터페이스를 AbstractList 정의한다. 이와 마찬가지로 리스트를 계속 반복해서 접근하는 필요한 공통 인터페이스를 정의하는 Iterator추상 클래스가 필요한다.

4) 그리고 나서 서로 다른 리스트의 구현 방식마다 구체적인 반복 기법을 제공하는 Iterator클래스의 서브 클래스를 제공하면 된다.

 

// 사용자는 추상 클래스들만 접근하기 때문에, 실제 구체적 리스트 구현이나 반복기법에 종속적이지 않게 되고, 런타임에 리스트의 구현 방법과 반복자를 변경할 있게 된다.

 

5) 반복자 객체 생성

- List 상속받는 서브클래스들과 독립적으로 반복자를 개발해야 하므로 어떤 특정 클래스를 선택해서 인스턴스를 만들 없다.

- 필요한 Iterator 생성할 있는 리스트 객체를 별도로 두도록한다. 이것은 사용자가 Iterator객체가 필요할 , CreateIterator() 같은 연산을 이용해서 Iterator 얻을 있다는 것이다.

 

// CreateIterator() 구현에는 팩토리 매서트 패턴을 사용할 있다. List 상속받는 클래스와 Iterator 상속받는 클래스로 구성된 개의 상속 구조를 갖게 된다. 팩토리 매서트인 CreateIterator() 상속 구조의 클래스가 서로 관련이 된다.

 

구조도

 

활용성

1. 객체 내부 표현 방식을 모르고도 집합 객체의 원소들에 접근하고 싶을 .

2. 집합 객체를 순회하는 다양한 방법을 지원하고 싶을 .

3. 서로 다른 집합 객체 구조에 대해서도 동일한 방법으로 순회하고 싶을 .

 

정리

반복자(Iterator) 패턴은 컨테이너의 반복에 있어서 일관된 인터페이스를 두어 반복의 일반화를 가능하게 한다. 더구나 이점을 이용해서 알고리즘도 반복자를 수용하고 있으므로 알고리즘에도 일관된 사용이 가능하다. 원론적으로 생각하면, 내부의 돌아가는 상황은 다르지만 겉으로 사용하기에는 동일한 인터페이스화가 가능할때 반복자 패턴을 적용할 있다.

'Design Pattern' 카테고리의 다른 글

[Design pattern] Singleton Pattern with C++ 11  (0) 2015.07.29
[Design pattern] DECORATOR  (0) 2013.02.25
[Design pattern] 복합체 Composite  (0) 2013.02.25
[Design pattern] 감시자 Observer  (0) 2013.02.25
[Design pattern] Bridge  (0) 2013.02.21