1. 이 두 개념이 왜 중요한가요
- **이터레이터(iterator)**는 반복 가능한 데이터를 하나씩 꺼내는 도구
- **제너레이터(generator)**는 그런 이터레이터를 쉽고 효율적으로 만드는 방법
즉, 제너레이터는 이터레이터를 만드는 ‘간편 레시피’입니다!
이해를 위한 비유: "마트 장보기"
- 이터레이터는 마트에서 장바구니에 담긴 물건을 하나씩 꺼내는 사람
- 제너레이터는 그 장바구니를 자동으로 채워주고 하나씩 꺼내주는 기계
2. 이터레이터(iterator)란?
이터레이터는 __iter__()와 __next__() 메서드를 가진 객체입니다.
nums = [1, 2, 3]
it = iter(nums)
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
# print(next(it)) # StopIteration 예외 발생
- next()를 호출할 때마다 값을 하나씩 반환
- 모든 이터레이터는 상태를 기억하고 있음
- 끝에 도달하면 StopIteration 예외 발생
3. 제너레이터(generator)란?
제너레이터는 yield 키워드를 사용하여 값을 하나씩 반환하는 함수형 이터레이터입니다.
def countdown(n):
while n > 0:
yield n
n -= 1
for i in countdown(3):
print(i)
출력:
3
2
1
- 값을 미리 다 만들지 않고, 하나씩 필요할 때마다 계산
- 메모리 절약 가능 (특히 큰 리스트나 파일 처리 시 강력)
4. 리스트 vs 제너레이터 차이
# 리스트 컴프리헨션: 메모리에 전체 저장
squares = [x**2 for x in range(1000000)]
# 제너레이터 표현식: 메모리에 저장하지 않음
squares_gen = (x**2 for x in range(1000000))
- squares는 100만 개의 값을 한꺼번에 저장하지만,
- squares_gen은 값을 하나씩 생성해서 처리
5. 언제 이터레이터/제너레이터를 써야 할까?
| 상황 | 추천 도구 | 이유 |
| 모든 데이터를 한꺼번에 써야 함 | 리스트 | 직관적이고 접근 쉬움 |
| 데이터가 매우 많음 | 제너레이터 | 메모리 절약 |
| 무한한 데이터를 스트림 (ex: 센서, 로그) | 제너레이터 | 끝없이 처리 가능 |
| 반복 객체를 직접 제어하고 싶을 때 | 이터레이터 | next()로 직접 조작 가능 |
6. 제너레이터 내부 동작 흐름
def my_gen():
print("Start")
yield 1
print("Continue")
yield 2
print("End")
yield 3
g = my_gen()
print(next(g)) # Start → 1
print(next(g)) # Continue → 2
print(next(g)) # End → 3
- yield를 만날 때마다 함수가 멈췄다가
- 다음 next() 호출 시 이전 위치부터 다시 실행
정리하면
이터레이터는 반복할 수 있는 객체,
제너레이터는 그걸 더 쉽고 효율적으로 만드는 도구입니다.
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 파이썬 예외 처리 구문 완전 정복: try, except, else, finally (0) | 2025.06.22 |
|---|---|
| 리스트 컴프리헨션과 제너레이터의 메모리 사용 차이! (0) | 2025.06.22 |
| 리스트 컴프리헨션, 어디까지 써야 똑똑한 걸까? (0) | 2025.06.22 |
| 파이썬 inspect 모듈, 쉽게 이해하기 (1) | 2025.06.22 |
| "로직"이란 정확히 무슨 뜻일까? (0) | 2025.06.10 |