'Iterator'에 해당되는 글 2건

  1. 2012.06.18 Iterator pattern
  2. 2010.01.04 advance()함수

먼저 이 글은 영문 위키의 글을 번역한 글임을 알려드립니다.

영어 실력이 부족한 관계로 오역이 있을 수도 있습니다.

원문 주소 :  http://en.wikipedia.org/wiki/Iterator_pattern



Behavioral - Iterator pattern



객체지향 프로그래밍(object-oriented programming)에서, 이터레이터 패턴(iterator pattern)반복자(iterator)컨테이너(container)(List, Set, Map등을 말합니다.)를 돌면서 컨테이너의 요소(elements)에 접근하는 디자인 패턴(design pattern)이다. ; 어떤 경우에 컨테이너에 특화된 알고리즘이 필요한 경우가 있고 따라서 이런 부분은 컨테이너와의 독립성을 유지하기 힘들다.


예를 들어, SearchForElement라는 가상의(hypothetical) 알고리즘이 컨테이너에 특화된 알고리즘으로 구현하지 않고, 특정 타입의 반복자(iterator)를 사용해서 구현할 수 있다. 이렇게 하면 SearchForElement는 그 타입의 iterator(앞에서 구현한 특정타입의 반복자)를 지원하는 어떤 컨테이너에서든지 사용할 수 있게 된다. 

정의 Definition

Iterator Factory method pattern의 본질(essence)은 "세부적인 구현(underlying representation)을 노출시키지 않고서, 컨테이너(aggregate object)의 요소에 차례대로 접근할 수 있는 방법을 제공하는 것"이다.

언어에 특화된 구현 Language-specific implementation

메인 글 : Iterator
일부 언어는 문법을 표준화하고 있다. C++과 Phython이 이에 속한다.

C++

C++ 에서는 구분자(iterator)를 pointer의 의미(semantics)로 구현한다. C++에서 어떤 클래스는 포인터의 모든 오퍼레이션을 오버로드할 수 있어서,  반복자에서 역참조(dereference), 증가, 감소 연산을 완벽히 구현할 수 있다. 이는 평범한 메모리 버퍼에 std::sort같은 알고리즘을 바로 사용할 수 있고, 새로 배워야할 문법이 없다는 장점이 있다. 하지만, 컨테이너의 마지막인지 확인하기 위해서는 반복자가 스스로 알지 못하기 때문에 마지막("end") 반복자를 알고 있어야 한다는 단점이 있다. 우리는 C++에서 반복자가 iterator 컨셉(concept)을 본보기로 하고 있다고 말한다.


Python

Python은 언어자체에서 반복자를 하나의 문법으로 지정하고 있어서 for 같은 키워드와 함께 사용된다. sequence에는 __iter__()라는 메서드가 있는데 이 메서드는 반복자 객체를 반환한다. next()메서드를 통해 다음 요소를 반환하거나, sequence의 끝에 도달하면 StopIteration 예외(exception)를 발생시킨다. 반복자도 __iter__()메서드를 가지고 있어서 스스로를 반환시킬 수 있다.


Java

자바는 Collections 클래스가 구현해야만하는 Iterator 인터페이스가 있다. (그래서 자바의 컬렉션들은 모두 Iterator인터페이스를 구현하고 있고, Map이든 Set이든 List든 상관없이 Iterator 인터페이스를 이용해서 모든 요소 검사를 할 수 있죠.)

저작자 표시 비영리 변경 금지
신고

'Design Patterns > 영문 위키(Wikipedia)' 카테고리의 다른 글

Memento pattern  (0) 2012.06.20
Mediator pattern  (0) 2012.06.19
Iterator pattern  (0) 2012.06.18
Interpreter pattern  (0) 2012.06.15
Command Pattern  (0) 2012.06.15
Chain-of-responsibility pattern  (0) 2012.06.08
Posted by Code-Moon

댓글을 달아 주세요

void std::advance(_InIt & _Where, _Diff _Off)
iterator를 원하는 위치로 옮길 수 있는 함수이다. 컨테이너의 iterator를 i번째 위치로 옮기고 싶을 때 사용할 수 있다.
첫번째 인자로는 iterator가 들어가고 두번째 인자로는 오프셋이 들어간다.
결과로는 현재 iterator를 오프셋만큼 뒤로 이동시킨다.
 vector<int> a;
 vector<int>::iterator it;
 a.push_back(13);
 a.push_back(2);
 a.push_back(3);
 it = a.begin();
 int n;
 n = 0;
 advance(it, n);
 cout << *it << endl; 

이러한 코드를 작성하게 되면 13이라는 결과가 출력된다. 즉, iterator가 전혀 이동하지 않았다.
만약 n에 2를 넣어준다면 iterator가 2만큼 이동하여 3이 들어가는 위치로 이동하게 될 것이다.
벡터에서는 이러한 advance()함수를 사용할 일이 별로 없을지 몰라도 list같은 컨테이너를 사용할 때에는 활용도가 아주 높을 것 같다.

신고

'프로그래밍 > C++' 카테고리의 다른 글

cout에서 소수점 둘째자리 표현하기  (0) 2010.01.04
advance()함수  (0) 2010.01.04
Posted by Code-Moon

댓글을 달아 주세요

티스토리 툴바