hhkb.dev

BLOG

2025-12-15 / 파이썬기초 · 02

제너레이터와 이터레이터

1. 이터러블(Iterable)과 이터레이터(Iterator)

먼저 이 두 개념을 구분해두면 제너레이터가 왜 필요한지 이해하기 쉽다.

  • 이터러블: 반복 가능한 객체다. list, str, tuple처럼 for 문에 넣을 수 있는 값이 여기에 들어간다.
  • 이터레이터: next()를 호출할 때마다 다음 값을 하나씩 꺼내 주는 객체다. 모든 값을 한꺼번에 메모리에 올리지 않고, 필요할 때마다 값을 만든다.

2. 제너레이터 (Generator)

제너레이터는 이터레이터를 만드는 가장 간단한 방법이다. 함수 안에서 return 대신 yield를 쓰면 된다.

2.1. 일반 함수 vs 제너레이터

  • 일반 함수: 호출되면 return을 만날 때까지 한 번에 실행되고 끝난다.
  • 제너레이터: yield를 만나면 값을 하나 내보내고 잠시 멈춘다. 다음 next() 호출이 들어오면 멈춘 지점부터 다시 실행된다.
def my_gen():
    yield 1
    yield 2
    yield 3

g = my_gen()
print(next(g)) # 1
print(next(g)) # 2

3. 왜 쓰는가? (메모리 효율)

제너레이터를 쓰는 가장 큰 이유는 메모리 효율이다. 100만 개 숫자를 만든다고 가정하면 차이가 바로 보인다.

  • 리스트: 100만 개 값을 한 번에 메모리에 올린다.
  • 제너레이터: 필요할 때마다 값 하나씩만 만든다.
# 리스트 컴프리헨션 (메모리 많이 씀)
my_list = [i for i in range(1000000)]

# 제너레이터 표현식 (메모리 아낌) - 소괄호 사용
my_gen = (i for i in range(1000000))