파이썬/기초 프로그래밍

제너레이터 vs 이터레이터, 쉽게 이해하기

Data Jun 2025. 6. 22. 14:56

 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() 호출 시 이전 위치부터 다시 실행

 

정리하면

 

이터레이터는 반복할 수 있는 객체,

제너레이터는 그걸 더 쉽고 효율적으로 만드는 도구입니다.