이터레이터
Iterator
컬렉션의 요소를 순회하는 객체. Python의 __iter__, __next__ 구현. for 루프의 기반.
Iterator
컬렉션의 요소를 순회하는 객체. Python의 __iter__, __next__ 구현. for 루프의 기반.
이터레이터(Iterator)는 컬렉션의 요소들을 순차적으로 접근하기 위한 디자인 패턴이자 객체입니다. 컬렉션의 내부 구조를 노출하지 않고도 요소들을 하나씩 탐색할 수 있게 해줍니다. 대부분의 현대 프로그래밍 언어에서 for 루프의 기반이 되는 핵심 개념입니다.
Python에서 이터레이터는 __iter__()와 __next__() 메서드를 구현한 객체입니다. __iter__()는 이터레이터 자신을 반환하고, __next__()는 다음 요소를 반환하거나 StopIteration 예외를 발생시킵니다. 리스트, 딕셔너리, 문자열 등 모든 반복 가능한(iterable) 객체는 이터레이터를 제공합니다.
이터레이터의 핵심 장점은 지연 평가(lazy evaluation)입니다. 모든 요소를 메모리에 미리 로드하지 않고, 필요할 때마다 하나씩 생성합니다. 이를 통해 무한 시퀀스도 다룰 수 있고, 대용량 데이터 처리 시 메모리 효율이 크게 향상됩니다.
JavaScript에서는 Symbol.iterator를 구현하여 이터레이터 프로토콜을 따릅니다. for...of 루프, 전개 연산자(...), 구조 분해 할당 등이 이터레이터를 활용합니다. Rust에서는 Iterator 트레이트가 이 역할을 하며, 함수형 스타일의 map, filter, collect 등 풍부한 어댑터를 제공합니다.
# Python 이터레이터 예제
# 커스텀 이터레이터 클래스
class CountDown:
def __init__(self, start):
self.current = start
def __iter__(self):
return self
def __next__(self):
if self.current <= 0:
raise StopIteration
self.current -= 1
return self.current + 1
# 사용 예시
for num in CountDown(5):
print(num) # 5, 4, 3, 2, 1
# 내장 이터레이터 함수들
numbers = [1, 2, 3, 4, 5]
# iter()와 next()
it = iter(numbers)
print(next(it)) # 1
print(next(it)) # 2
# 이터레이터 도구들
from itertools import islice, cycle, chain
# 처음 3개만 가져오기
first_three = list(islice(numbers, 3)) # [1, 2, 3]
# 무한 반복
infinite = cycle([1, 2, 3])
print([next(infinite) for _ in range(7)]) # [1,2,3,1,2,3,1]
# 여러 이터러블 연결
combined = list(chain([1, 2], [3, 4])) # [1, 2, 3, 4]
데이터 엔지니어: "10GB 로그 파일을 처리하는데 메모리가 부족해서 OOM이 발생합니다."
시니어 개발자: "파일 전체를 리스트로 읽지 말고, 이터레이터로 한 줄씩 처리하면 됩니다."
데이터 엔지니어: "readline() 대신 파일 객체 자체를 이터레이터로 쓰면 되나요?"
시니어 개발자: "네, for line in file: 형태로 하면 자동으로 한 줄씩 읽습니다. 메모리 사용량이 일정하게 유지돼요."
면접관: "이터러블(iterable)과 이터레이터(iterator)의 차이점은 무엇인가요?"
지원자: "이터러블은 __iter__ 메서드를 가진 객체로, 이터레이터를 반환할 수 있습니다. 리스트나 딕셔너리가 예시입니다. 이터레이터는 __next__ 메서드를 가진 객체로 실제 순회를 수행합니다."
면접관: "이터레이터 패턴의 장점은?"
지원자: "컬렉션의 내부 구조를 숨기고 일관된 인터페이스를 제공합니다. 또한 지연 평가로 메모리 효율이 좋고, 무한 시퀀스도 표현할 수 있습니다."
리뷰어: "여기서 list()로 전체를 메모리에 올리고 있는데, 이터레이터를 그대로 사용하면 안 될까요?"
작성자: "여러 번 순회해야 해서 리스트로 변환했습니다. 이터레이터는 한 번만 사용 가능하잖아요."
리뷰어: "맞아요. 그런데 itertools.tee를 쓰면 이터레이터를 복제할 수 있어요. 아니면 제네레이터 함수를 만들어서 필요할 때마다 새로 생성하는 방법도 있고요."
작성자: "좋은 제안이에요. 데이터가 크니까 tee보다는 제네레이터 함수로 팩토리 패턴을 적용해 볼게요."