이터레이터는(iterator)는 값을 차례대로 꺼낼 수 있는 객체(object)를 말한다.

지금까지 for문을 사용할 때 range를 사용했다. 만약 100번을 반복한다면 for i range(100): 처럼 만들었다. 이때 range(100)은 0부터 99까지 연속된 숫자를 만들어 내는 것이 아니라 0부터 99까지 값을 차례대로 꺼낼 수 있는 이터레이터를 하나만 만들어낸다. 이후 반복될 때마다 이터레이터에서 숫자를 하나씩 꺼내서 반복한다.

연속한 숫자를 미리 만들어 놓을 경우 메모리를 많이 사용하게 되므로 성능이 떨어지게 된다. 그래서 파이썬에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을때 값을 만드는 방식을 사용한다. 이렇게 데이터 생성을 뒤로 미루는 방식을 지연 평가(lazy evaluation)이라고 한다.

반복 가능한 객체 알아보기

반복 가능한 객체(iterable)에 대해 알아보자. 반복 가능한 객체는 말 그대로 반복 할 수 있는 객체인데 흔히 사용하는 문자열 ,리슽, 딕셔너리, 세트가 반복 가능한 객체다. 즉, 요소가 여러개 들어있고, 한 번에 하나씩 꺼낼 수 있는 객체다.

객체가 반복 가능한 객체인지 알아보는 방법은 객체에 __iter__ 메서드가 있는지 확인해 보면 된다. 다음과 같이 __dir__ 함수를 사용하면 객체의 메서드를 확인할 수 있다.

>>> dir([1,2])
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', 
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', 
'__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', 
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', 
'__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy',
 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

리스트에서 dir 로 메서드를 살펴보면 __iter__ 메서드가 들어있다. 이터레이터를 변수에 저장한 뒤 __next__ 메서드를 호출해보면 요소를 차례대로 꺼낼 수 있다.

>>> i = [1,2,3,4].__iter__()
>>> i.__next__()
1
>>> i.__next__()
2
>>> i.__next__()
3

for문과 반복 가능한 객체

for문에 반복 가능한 객체를 사용했을 때 동작 과정을 알아보자. 다음과 같이 for에 range(3)을 사용했다면 먼저 range에서 __iter__로 이터레이터를 얻는다. 그리고 한 번 반복할 떄마다 이터레이터에서 __next__로 숫자를 꺼내서 i에 저장하고, 저장된 숫자 3이 되면 StopIteration을 발생시켜서 반복을 끝낸다.

클래스에 __iter____next__ 메서드를 모두 구현하면 이터레이터를 만들 수 있다. 특히 __iter__, __next__ 를 가진 객체를 이터레이터 프로토콜(iterator protocol)을 지원한다고 말한다.

<aside> ⭐ 반복 가능한 객체는 요소를 한 번에 하나씩 가져올 수 있는 객체이고, 이터레이터는 __next__메서드를 사용해서 차례대로 값을 꺼낼 수 있는 객체다. 반복 가능한 객체(iterable)과 이터레이터(iterator)는 별개의 객체이므로 둘은 구분해야한다. 즉, 반복 가능한 객체에서 __iter__ 메서드로 이터레이터를 얻는다.

</aside>

시퀀스 객체와 반복 가능한 객체의 차이

리스트, 튜플, range, 문자열은 반복 가능한 객체이면서 시퀀스 객체이다. 딕셔너리와 세트는 반복가능한 객체이지만 시퀀스 객체는 아니다. 시퀀스 객체는 요소의 순서가 정해져 있고 연속적(sequence)으로 이어져 있어야 한다.

이터레이터 만들기