반복자(Iterator)란?
파이썬에서 반복자(Iterator)는 반복 프로토콜(iteration protocol)을 구현하는 객체를 의미합니다. 튜플(tuple), 리스트(list), 셋(set) 등은 파이썬에 기본으로 내장된 반복자에 해당합니다. 반복 프로토콜에는 두 가지 핵심 메서드가 있습니다.
__iter__() : 반복자를 초기화할 때 호출되는 메서드입니다. 이 메서드는 반드시 next() 또는 __next__()(파이썬 3 기준) 메서드를 포함하는 객체를 반환해야 합니다.
next() 또는 __next__()(파이썬 3) : 반복 시퀀스에서 다음 요소를 반환하는 메서드입니다. 반복자가 for 루프와 함께 사용되면, for 루프는 반복자 객체의 next()를 직접 호출하여 요소를 하나씩 가져옵니다.
예제 코드
아래 예제는 2의 거듭제곱 값을 순차적으로 생성하는 사용자 정의 반복자를 구현한 것입니다.
# 사용자 정의 반복자 만들기
class Pow_of_Two:
def __init__(self, max=0):
self.max = max
def __iter__(self):
self.n = 0
return self
def __next__(self):
if self.n <= self.max:
result = 2 ** self.n
self.n += 1
return result
else:
raise StopIteration("Message")
a = Pow_of_Two(4)
i = iter(a)
print(i.__next__())
print(next(i))
print(next(i))
print(next(i))
print(next(i))
print(next(i))실행 결과
1 2 4 8 16 StopIteration 오류 발생
코드 동작 원리
위 예제에서 Pow_of_Two 클래스는 2의 거듭제곱 값을 생성하는 사용자 정의 반복자입니다. iter() 함수가 호출되면 __iter__() 메서드가 실행되어 카운터 변수 n을 0으로 초기화하고 자기 자신(self)을 반환합니다.
이후 next()가 호출될 때마다 2의 거듭제곱 값(1, 2, 4, 8, 16)이 하나씩 반환됩니다. 그리고 n이 최댓값인 4를 초과하면 StopIteration 예외가 발생하면서 반복이 종료됩니다. 이처럼 반복자는 데이터를 한 번에 메모리에 올리지 않고 필요할 때마다 하나씩 꺼내 쓸 수 있어 메모리 효율성이 뛰어나다는 장점이 있습니다.