프로그래밍/Python

파이썬 - Generator & Iterator

Terry Cho 2025. 3. 19. 17:06

제너레이터(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