파이썬에서는 리스트, 튜플, 딕셔너리 같은 컨테이너 객체를 순회(iteration)하는 개념이 매우 중요합니다. 반복자(Iterator)는 두 가지 핵심 메서드로 구성되어 있으며, 이를 활용하면 사용자가 직접 정의한 클래스에서도 반복 기능을 지원할 수 있습니다. 바로 __iter__()와 __next__()입니다.
__iter__() 메서드란?
__iter__() 메서드는 반복자(iterator) 객체 자신을 반환하는 역할을 합니다. 하나의 클래스가 서로 다른 방식의 순회를 지원해야 하는 경우, 추가적인 메서드를 함께 정의하여 다양한 작업을 수행하도록 설계할 수도 있습니다.
__next__() 메서드란?
__next__() 메서드는 컨테이너에서 다음 요소를 하나씩 꺼내어 반환합니다. 모든 요소를 소진하고 더 이상 반환할 값이 없으면, StopIteration 예외를 발생시켜 순회가 끝났음을 알립니다.
예제 코드
아래 예제는 1부터 max 값까지 각 숫자 x에 대해 x의 x제곱(x^x)을 계산하여 반환하는 사용자 정의 반복자 클래스입니다.
class PowerIter:
# 1부터 max 범위 내의 x에 대해 x ^ x 값을 반환
def __init__(self, max = 0):
self.max = max # 반복자의 최대 한계 설정
def __iter__(self):
self.term = 0
return self
def __next__(self):
if self.term <= self.max:
element = self.term ** self.term
self.term += 1
return element
else:
raise StopIteration # 최대값을 초과하면 예외 발생
powIterObj = PowerIter(10)
powIter = iter(powIterObj)
for i in range(10):
print(next(powIter))
실행 결과
1 1 4 27 256 3125 46656 823543 16777216 387420489
코드 실행 흐름을 살펴보면, 먼저 PowerIter(10)으로 객체를 생성하고 iter() 함수를 통해 반복자를 얻습니다. 이후 next() 함수가 호출될 때마다 __next__() 메서드가 실행되어 현재 항목의 거듭제곱 값을 계산해 반환하며, 항목이 최대값을 넘으면 StopIteration 예외로 순회를 종료합니다.