메뉴 닫기

파이썬 반복자(Iterator)의 모든 것, iter와 next의 원리

파이썬 반복자(Iterator)의 모든 것, iter와 next의 원리

🔁 for문 이면의 진짜 주인공, 파이썬 반복자의 원리를 파헤쳐봅니다

파이썬의 반복문은 정말 편리합니다.
리스트, 튜플, 문자열 등 다양한 자료형을 for문으로 쉽게 순회할 수 있죠.
하지만 그 이면에서 실제로 반복을 담당하는 것이 무엇인지 알고 계신가요?
바로 이터레이터(iterator)입니다.
이터레이터는 iter()next()라는 메서드를 기반으로 동작하며, 파이썬이 가진 이터러블(iterable) 구조의 핵심입니다.

이번 글에서는 이터레이터의 개념부터 실제 작동 방식, 그리고 우리가 자주 사용하는 for문 내부에서 일어나는 반복의 진짜 원리까지 낱낱이 설명해 드릴게요.
이터레이터를 이해하면 파이썬의 동작 원리를 한 단계 더 깊이 있게 파악할 수 있게 됩니다.



🔗 반복 가능한 객체와 이터레이터의 차이

파이썬에서 리스트, 튜플, 문자열처럼 for문으로 순회할 수 있는 객체들을 우리는 흔히 ‘반복 가능한 객체(iterable)’라고 부릅니다.
이들은 내부적으로 __iter__() 메서드를 가지고 있어 이터레이터 객체로 변환될 수 있죠.

반면, 이터레이터(iterator)__next__() 메서드를 가진 객체로,
next()를 호출할 때마다 다음 값을 순차적으로 반환하며, 더 이상 반환할 값이 없으면 StopIteration 예외를 발생시킵니다.

💎 핵심 포인트:
반복 가능한 객체(iterable)는 반복될 수 있는 구조이고, 이터레이터(iterator)는 실제로 반복을 수행하는 상태 기반 객체입니다.

📌 예제 코드로 차이점 이해하기

CODE BLOCK
fruits = ['apple', 'banana', 'cherry']  # iterable
iterator = iter(fruits)  # 이터레이터로 변환

print(next(iterator))  # apple
print(next(iterator))  # banana
print(next(iterator))  # cherry

위 코드에서 리스트 fruits는 반복 가능한 객체입니다.
하지만 iter() 함수를 통해 이터레이터 객체로 변환한 뒤에야 next()로 하나씩 꺼낼 수 있습니다.

⚠️ 주의: 반복 가능한 객체라고 해서 바로 next()를 사용할 수 있는 것은 아닙니다. 반드시 iter()를 통해 이터레이터로 변환해야 합니다.

🛠️ iter() 함수의 역할

iter() 함수는 반복 가능한 객체를 이터레이터 객체로 변환하는 데 사용됩니다.
파이썬은 리스트, 튜플, 딕셔너리, 문자열 등 대부분의 시퀀스를 __iter__() 메서드를 통해 이터레이터로 바꿀 수 있습니다.

이처럼 iter()는 단순한 형 변환 함수가 아니라, 객체의 반복 기능을 활성화하는 핵심적인 역할을 합니다.
이를 통해 next()를 호출해 한 항목씩 순회할 수 있게 되는 것이죠.

📌 iter() 함수 예제

CODE BLOCK
numbers = [10, 20, 30]
it = iter(numbers)

print(it)           # <list_iterator object at ...>
print(next(it))     # 10
print(next(it))     # 20

iter()를 호출하면 리스트가 즉시 이터레이터 객체로 변환되며,
next()를 통해 한 요소씩 차례로 꺼낼 수 있습니다.

💎 핵심 포인트:
iter()는 반복 가능한 객체에 대해 반복을 시작할 준비를 하는 함수이며, 반환된 이터레이터는 상태를 유지하며 순회합니다.

📌 커스텀 객체에 iter 적용

iter()는 사용자 정의 클래스에도 적용할 수 있습니다.
이 경우 __iter__() 메서드를 정의하고, 내부적으로 __next__()를 포함한 이터레이터를 반환해야 합니다.

CODE BLOCK
class MyNumbers:
    def __iter__(self):
        self.num = 1
        return self

    def __next__(self):
        if self.num <= 3:
            result = self.num
            self.num += 1
            return result
        else:
            raise StopIteration

nums = MyNumbers()
it = iter(nums)

for n in it:
    print(n)

이렇게 iter()는 내부 구조가 잘 갖춰진 객체에 대해 반복 기능을 부여하며, for문을 포함한 다양한 반복 구문과 함께 사용됩니다.



⚙️ next() 함수의 동작 원리

이터레이터 객체에서 next() 함수는 다음 값을 순차적으로 반환해줍니다.
매 호출마다 내부 상태를 기억하고 있다가, 그 다음 요소를 반환하는 것이 특징입니다.
더 이상 반환할 값이 없으면 StopIteration 예외가 발생하여 반복이 종료됩니다.

이는 단순한 함수 호출이 아니라, 이터레이터 프로토콜에 따라 정의된 __next__() 메서드를 호출하는 것과 같습니다.

📌 next() 예제 코드

CODE BLOCK
data = [1, 2]
it = iter(data)

print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # StopIteration 발생

세 번째 next() 호출에서는 더 이상 요소가 없기 때문에 StopIteration 예외가 발생합니다.
이 동작은 for문 내부에서 자동으로 처리되기 때문에 평소에는 의식하지 않고 사용하게 되죠.

⚠️ 주의: next()를 직접 사용할 경우 StopIteration 예외에 대비하여 try-except 문이나 기본값 설정이 필요합니다.

📌 기본값 지정 사용법

next() 함수는 두 번째 인자로 기본값을 받을 수 있습니다.
이터레이터가 끝났을 때 예외 대신 이 기본값을 반환하도록 설정할 수 있죠.

CODE BLOCK
nums = [100]
it = iter(nums)

print(next(it, '끝'))  # 100
print(next(it, '끝'))  # 끝

기본값을 지정해두면 StopIteration 예외를 방지할 수 있어 코드가 더 안전해집니다.
이는 실시간 데이터 처리나 네트워크 기반 반복 작업에서 특히 유용하게 쓰입니다.

🔌 for문 내부에서 일어나는 일

우리가 매일 사용하는 for 반복문.
겉보기에는 간단하지만, 내부에서는 파이썬이 iter()next()를 자동으로 호출하며 반복을 수행하고 있습니다.

즉, for item in iterable: 구문은 실제로는 다음과 같은 과정을 거칩니다:

  • ➡️iter()를 호출해 이터레이터를 생성합니다.
  • ➡️이터레이터에서 next()를 반복적으로 호출합니다.
  • ➡️StopIteration이 발생하면 반복을 종료합니다.

📌 for문과 동일한 동작 구현

CODE BLOCK
data = [1, 2, 3]
it = iter(data)

while True:
    try:
        item = next(it)
        print(item)
    except StopIteration:
        break

위 코드는 for item in data: 구문과 완전히 동일한 동작을 수행합니다.
단지 우리가 직접 iter()next()를 호출했을 뿐이죠.

💎 핵심 포인트:
for문은 반복 가능한 객체를 자동으로 이터레이터로 바꾼 뒤, next()를 호출하며 순회하는 고수준 문법입니다.

이터레이터의 원리를 이해하면 for문을 더욱 유연하게 활용할 수 있으며, 반복의 흐름을 세밀하게 제어하는 코드도 작성할 수 있게 됩니다.



💡 커스텀 이터레이터 만들기

파이썬에서는 클래스를 통해 직접 이터레이터 객체를 구현할 수 있습니다.
이렇게 커스텀 이터레이터를 만들면 반복 구조를 자유롭게 설계할 수 있어, 특정 조건에 따라 데이터를 순회하는 기능을 구현할 수 있습니다.

기본적으로 이터레이터를 만들기 위해서는 클래스 내부에 __iter__()__next__() 메서드를 정의해야 하며,
__iter__()는 자기 자신을 반환하고, __next__()는 반복 시 반환할 값을 지정해야 합니다.

📌 1부터 N까지 출력하는 이터레이터

CODE BLOCK
class CountUpTo:
    def __init__(self, max):
        self.max = max
        self.current = 1

    def __iter__(self):
        return self

    def __next__(self):
        if self.current <= self.max:
            num = self.current
            self.current += 1
            return num
        else:
            raise StopIteration

for num in CountUpTo(3):
    print(num)

위 예제는 1부터 지정한 숫자까지 반복해 출력하는 커스텀 이터레이터입니다.
for문 안에서 일반 이터러블처럼 작동하며, 내부에서는 __iter__()__next__()가 자동 호출됩니다.

💎 핵심 포인트:
커스텀 이터레이터는 반복 조건과 순서, 예외 처리 등 반복 흐름을 자유롭게 제어할 수 있는 강력한 도구입니다.

📌 반복 제어가 필요한 경우 활용

기본 반복문만으로는 처리하기 어려운 상황,
예를 들어 조건부 필터링, 제한된 횟수만 반복, 매번 계산되는 값 등의 경우 커스텀 이터레이터가 유용하게 쓰입니다.

또한 데이터 스트림 처리, 파일 읽기, 시뮬레이션, 알고리즘 테스트 등에서도 반복 상태를 직접 관리할 수 있다는 점에서 큰 장점이 됩니다.

❓ 자주 묻는 질문 (FAQ)

반복 가능한 객체와 이터레이터는 어떻게 구분하나요?
반복 가능한 객체는 __iter__() 메서드만 가지고 있고, 이터레이터는 __next__() 메서드도 함께 가지고 있습니다. iter() 함수로 이터레이터로 변환 가능하면 iterable입니다.
next()를 직접 사용해야 할 때가 있나요?
일반적으로는 for문을 사용하는 것이 좋지만, 반복을 세밀하게 제어하거나 중간에 멈추는 로직이 필요할 때 next()를 직접 사용할 수 있습니다.
StopIteration 예외는 반드시 처리해야 하나요?
for문 내부에서는 자동으로 처리되므로 따로 신경 쓸 필요가 없지만, next()를 직접 호출할 때는 try-except로 예외를 처리하거나 기본값을 지정하는 것이 안전합니다.
모든 리스트가 이터레이터인가요?
아닙니다. 리스트는 반복 가능한 객체일 뿐이며, iter()를 호출해야 이터레이터로 변환됩니다.
이터레이터는 메모리를 아끼는 데 도움이 되나요?
네. 이터레이터는 한 번에 하나의 값만 메모리에 올리기 때문에, 큰 데이터셋을 다룰 때 메모리 사용량을 줄일 수 있습니다.
제너레이터(generator)와 이터레이터는 다른가요?
제너레이터는 이터레이터의 일종입니다. 함수에서 yield를 사용하면 자동으로 이터레이터가 생성되며, 더 간결하게 반복 구조를 정의할 수 있습니다.
이터레이터는 왜 상태를 기억하나요?
이터레이터는 이전 호출 이후의 위치를 기억해야 다음 요소를 반환할 수 있기 때문입니다. 내부적으로 포인터 같은 개념을 유지합니다.
이터레이터를 다시 처음부터 반복하려면 어떻게 하나요?
기존 이터레이터는 재사용할 수 없으므로, iterable 객체에서 iter()를 다시 호출하여 새로운 이터레이터를 만들어야 합니다.

📘 파이썬 반복 구조의 핵심, 이터레이터 완전 정복

이번 글에서는 파이썬의 반복 구조에서 핵심적인 개념인 이터레이터(iterator)반복 가능한 객체(iterable)의 차이부터,
iter()next() 함수의 역할,
그리고 커스텀 이터레이터 구현 방법까지 하나하나 자세히 살펴보았습니다.
단순히 for문만 사용하는 수준을 넘어, 반복의 원리를 이해하고 더 나아가 반복 흐름을 제어할 수 있는 능력을 갖추게 된다면,
더욱 유연하고 효율적인 파이썬 코드를 작성할 수 있습니다.

특히 대용량 데이터 처리, 제너레이터 활용, 스트림 기반 프로그래밍 등을 다룰 때 이터레이터에 대한 깊은 이해는 반드시 필요합니다.
파이썬의 이터레이터 프로토콜은 단순하면서도 강력하며, 실무에서도 매우 자주 활용되는 기법입니다.
이 글이 여러분의 파이썬 실력을 한층 끌어올리는 데 도움이 되었기를 바랍니다.


관련 태그: 파이썬, 반복문, 이터레이터, iterable, iter함수, next함수, 파이썬기초, for문원리, 커스텀이터레이터, StopIteration