이터레이터 패턴(Iterator Pattern)은 컬렉션의 내부 구조를 노출하지 않고 순차 접근을 제공하는 행동 패턴이다. Python의 for 루프, Java의 Iterable, C#의 IEnumerable이 이 패턴을 기반으로 한다.
Python 프로토콜
python
class NumberRange:
"""범위 이터레이터"""
def __init__(self, start: int, end: int, step: int = 1):
self.start = start
self.end = end
self.step = step
def __iter__(self):
return NumberRangeIterator(self)
class NumberRangeIterator:
def __init__(self, range_obj: NumberRange):
self._range = range_obj
self._current = range_obj.start
def __iter__(self):
return self
def __next__(self):
if self._current >= self._range.end:
raise StopIteration
value = self._current
self._current += self._range.step
return value
# 사용
for n in NumberRange(0, 10, 2):
print(n) # 0 2 4 6 8
제너레이터를 이용한 단순 구현
python
class Tree:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def inorder(self):
"""중위 순회 제너레이터"""
if self.left:
yield from self.left.inorder()
yield self.value
if self.right:
yield from self.right.inorder()
tree = Tree(4, Tree(2, Tree(1), Tree(3)), Tree(6, Tree(5), Tree(7)))
print(list(tree.inorder())) # [1, 2, 3, 4, 5, 6, 7]
외부 vs 내부 이터레이터
| 구분 | 제어 주체 | 예시 |
|---|
| 외부 이터레이터 | 클라이언트 | Python for loop |
| 내부 이터레이터 | 이터레이터 자신 | JavaScript forEach |
관련 개념