제너레이터(Generator)와 이터레이터(Iterator) 비교: 장단점
제너레이터와 이터레이터는 모두 파이썬에서 값을 순차적으로 생성하는 데 사용되는 객체입니다. 하지만 구현 방식과 사용 사례에서 차이가 있습니다.
이터레이터 (Iterator)
정의:
- 이터레이터는
__iter__()
와__next__()
라는 두 개의 특별한 메서드(매직 메서드 또는 던더 메서드)를 구현하여 값을 순차적으로 꺼낼 수 있도록 하는 객체입니다. __iter__()
메서드는 이터레이터 객체 자신을 반환합니다.__next__()
메서드는 다음 값을 반환하거나, 더 이상 반환할 값이 없을 때StopIteration
예외를 발생시킵니다.
구현 예:
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self # 이터레이터 객체 자신을 반환
def __next__(self):
if self.index >= len(self.data):
raise StopIteration # 더 이상 반환할 값이 없으면 예외 발생
value = self.data[self.index]
self.index += 1
return value
# 이터레이터 사용
my_iter = MyIterator([1, 2, 3])
for item in my_iter:
print(item)
장점:
- 클래스 기반의 유연성: 이터레이터는 클래스로 구현되므로, 복잡한 로직을 가진 이터레이터를 만들 수 있습니다. 예를 들어, 특정 조건에 따라 값을 필터링하거나 변환하는 이터레이터를 만들 수 있습니다.
- 상태 유지: 이터레이터는 현재 상태(예:
self.index
)를 유지하므로, 순회 중에 필요한 정보를 저장하고 사용할 수 있습니다.
단점:
- 코드 복잡성:
__iter__()
와__next__()
메서드를 모두 구현해야 하므로 코드가 상대적으로 복잡해집니다. 간단한 이터레이터를 만들기 위해서는 보일러플레이트 코드(boilerplate code)가 많아질 수 있습니다.
제너레이터 (Generator)
정의:
- 제너레이터는
yield
키워드를 사용하여 이터레이터를 간편하게 생성하는 방법입니다. - 제너레이터 함수는 일반 함수처럼 정의되지만,
yield
문을 사용하여 값을 반환하고 실행을 일시 중지합니다. - 다시 호출되면 중지되었던 지점부터 실행을 재개합니다.
구현 예:
def my_generator(data):
for item in data:
yield item
# 제너레이터 사용
gen = my_generator([1, 2, 3])
for item in gen:
print(item)
장점:
- 간결성:
yield
키워드 하나로 이터레이터를 생성할 수 있으므로 코드가 훨씬 간결해집니다. - 자동 상태 관리: 제너레이터는 자동으로 함수의 상태(로컬 변수, 실행 위치 등)를 저장하고 복원하므로, 개발자가 직접 상태를 관리할 필요가 없습니다.
- 메모리 효율성: 값을 미리 생성하여 메모리에 저장하지 않고, 필요할 때마다 하나씩 생성하므로 메모리 사용량이 적습니다. 특히 큰 데이터 시퀀스를 처리할 때 유용합니다.
- 지연 평가(Lazy Evaluation): 값이 실제로 필요할 때까지 계산을 미루므로, 불필요한 계산을 줄이고 성능을 향상시킬 수 있습니다.
단점:
- 단방향: 제너레이터는 한 번 순회하면 끝입니다. 다시 순회하려면 새로운 제너레이터 객체를 생성해야 합니다. (이터레이터는
__iter__()
를 다시 호출하여 초기화할 수 있습니다.) - 제한적인 기능: 클래스 기반 이터레이터만큼 복잡한 로직을 구현하기는 어렵습니다. (하지만 대부분의 경우 제너레이터로 충분합니다.)
'프로그래밍 > Python' 카테고리의 다른 글
파이썬 - Function annotation ("->") (0) | 2025.03.20 |
---|---|
파이썬 - Coroutine과 await (0) | 2025.03.20 |
파이썬 - yield 키워드 (0) | 2025.03.19 |
파이썬 - pass 키워드 (0) | 2025.03.19 |
파이썬 - 클래스 개념 (0) | 2025.03.19 |