오늘 이것들에 대한 내용을 공부하며 어느정도 머리속에서 정리된 내용을 글로 적는다.

Iterator란 Iterable한 대상에 대한 포인터같은 개념으로, 해당 Iterable한 컨테이너를 Traverse하는 기능을 한다. 예를들어 C++에서는 STL의 vector 경우가 iterable한 컨테이너를 의미하게 되고, 그 컨테이너를 Traverse하는 iterator를 선언할 수 있다. 혹은 Python에서의 for문이나 다른 언어에서의 foreach문의 경우에는 Implicit iterator의 예라고 볼 수 있다. 그리고 iterator를 구현하는 한 방법이, 특수한 subroutine인 Generator를 이용하는 것이다.

Generator란 iteration을 위해 사용되는 특수한 routine으로, 쉽게 말해서 배열을 리턴하는 함수라고 생각하면 된다. 단, Generator는 실제로 배열을 리턴하는 것이 아니라, iteration의 매 단계마다 호출이 되어, 결과를 얻는다(yield). Generator에서의 yield의 사용은 매우 특수한데, return과 다르게 yield는 결과를 반환한 후 매 번 호출될 때 마다 값을 반환했던 yield의 위치부터 다시 수행이 계속된다. 따라서 다음과 같은 반복문은 일련의 iterator를 생성한다.

i = 0
while True:
    yield i
    i ++ 1

또한 이런 특수한 yield의 control flow는 Coroutine같은 구조를 구현하는 데도 사용된다.

Coroutine이란 다수의 entry point가 존재하는 subroutine을 말한다. yield를 사용하는 경우 다음 호출때는 yield의 다음부터 수행되므로, 이런 방법으로 다수의 entry를 만들 수 있다. Coroutine을 만든다는 것은 여러 프레임의 작업을 할 수 있다는 의미이므로 cooperative task 등에 사용할 수 있으며, 일부 Single Threaded 프로그램에서 병렬적으로 Process를 처리하고자 하는 경우에도 사용할 수 있다. 구현은 Generator를 이용해서 할 수 있는데, Generator가 각 호출마다 값을 반환한 이후 재호출 시 그 다음 위치부터 수행이 계속되는 원리를 이용하여 여러개의 yield를 가진 Generator를 계속해서 호출함으로써 Coroutine을 구현한다.

print 'Hello, World!'
yield raw_input('Enter your name: ')
print '...'
yield '2nd!'