yield는 return과 동작이 유사하지만, 값을 반환한 뒤 함수의 상태(변수, 실행 위치 등)를 그대로 일시정지 시킵니다.
같은 함수가 다시 호출된다면, 처음부터가 아닌 멈췄던 부분부터 다시 실행됩니다.
def func(n):
for i in n:
yield i # i를 반환하고 종료(하지만 어디까지 순회했는지 기억함)
gen = func(['a', 'b', 'c'])
print(next(gen)) # 첫 번째 호출에서는 'a' 출력
print(next(gen)) # 두 번째 호출에서는 'b' 출력
작동방식
일반적인 함수는 호출될 때 메인 메모리의 스택에 스택 프레임(Stack Frame)의 형태로 추가됩니다. 함수의 동작이 모두 끝나고 return을 하면 이 스택 프레임은 다시 제거됩니다.

반면 yield를 통해 함수가 종료된다면 스택 프레임이 완전히 사라지는 대신 그 값들이 힙(Heap) 영역으로 이동해 저장됩니다. 저장되는 값으로는 코드가 실행된 지점, 그 시점에 각 변수들에 저장되어 있던 값 등이 있습니다.

제네레이터(Generator)
제너레이터는 반복자(Iterator)의 한 종류입니다. 하지만 다른 반복자와는 달리 데이터를 한꺼번에 메모리에 올리지 않고, 필요할 때마다 하나씩 생성해서 반환한다는 특징이 있습니다. yield를 이용하면 제네레이터를 구현할 수 있습니다.
# list를 사용할 때
def make_list(n):
result = []
for i in range(n):
result.append(i)
return result # n 개 값을 한번에 반환
# generator를 사용할 때
def make_generator(n):
for i in range(n):
yield i # 일단 하나의 값만 반환
어떤 수가 주어졌을 때, 그 수 만큼의 값들을 순회하는 함수를 구현한다고 합시다.
리스트를 사용하는 경우, 1억 개의 숫자를 만들면 1억 개를 모두 메모리에 올려야 합니다. 이렇게 하면 메모리 부족으로 에러가 발생할 수도 있습니다.
제네레이터를 사용하는 경우, 처음엔 모든 숫자를 메모리에 올리지 않습니다. 다음 숫자를 호출할 때가 되어서야 그 숫자를 메모리에 올리게 됩니다.
SIZE = 100000000 # 아주 큰 수가 있다고 할 때
lis = make_list(SIZE) # SIZE 크기 만큼의 메모리를 모두 사용
print(next(lis))
print(next(lis))
gen = make_generator(100000000) # 이때는 아무것도 계산하지 않음
print(next(gen)) # 0 반환 (메모리에 올림)
print(next(gen)) # 1 반환 (메모리에 올림)
또한 yield가 실행을 멈추고 제어권을 넘겨주는 특성을 이용하면, 한 번에 여러 개의 함수(작업)을 왔다갔다 하면서 context switching을 구현할 수도 있습니다. 실제로 이 개념을 연장하면 async-await과 연결할 수도 있습니다.
def task(n):
for i in range(n):
yield i
task1 = task([inst1, inst2, ..., instn]) # task1이 할 일들
task2 = task([inst1, inst2, ..., instn]) # task2가 할 일들
do_task(next(task1)) # task1을 수행하다가
do_task(next(task2)) # 잠시 멈추고 task2를 수행하다가
do_task(next(task1)) # 다시 task1을 수행
# ... 반복
제너레이터는 거대한 데이터를 다룰 때 메모리를 아끼고, 또 함수의 실행 흐름을 사용자가 원하는 대로 멈추거나 재시할 수 있게 해줍니다.
'Language > Python' 카테고리의 다른 글
| [Python] 동시성과 GIL(Global Interpreter Lock) (0) | 2026.02.15 |
|---|---|
| [Python] Syntax | 02. List (0) | 2026.02.15 |
| [Python] Library | 07. boto3 (0) | 2025.12.31 |
| [Python] Library | 06. OS (0) | 2025.07.28 |
| [Python] requirements.txt 파일 작성하기 (0) | 2025.02.16 |