
개요
파이썬에서 리스트나 튜플을 'for' 루프에 넣으면 요소들이 하나씩 차례대로 출력된다. 이 당연해 보이는 동작 뒤에는 파이썬의 핵심 프로토콜인 이터러블(Iterable)과 이터레이터(Iterator)가 존재한다. 본 포스팅에서는 두 개념의 차이와 내부 작동 원리를 상세히 분석한다.
1. 이터러블(Iterable)이란?
이터러블은 '반복 가능한 객체'를 말한다. 내부에 여러 개의 요소를 담고 있으며, 이를 하나씩 꺼낼 수 있는 구조를 갖춘 객체(리스트, 튜플, 문자열 등)이다.
iter 존재 여부 확인
객체가 이터러블인지 확인하려면 내장 함수인 dir()을 사용한다. 실제 리스트 객체를 대상으로 실행하면 다음과 같은 결과를 볼 수 있다.
nums = [1, 2, 3]
print(dir(nums))

설명: dir() 함수는 객체가 가진 모든 메서드와 속성을 리스트 형태로 반환한다. 출력된 수많은 메서드 중 'iter'가 존재한다면, 해당 객체는 이터러블 상태임을 의미한다. 즉, iter() 함수를 통해 이터레이터를 생성할 준비가 된 객체라는 증거이다.
2. 이터레이터(Iterator)란?
이터레이터는 이터러블 객체에서 실제 데이터를 하나씩 추출하는 '상태를 가진 일꾼'이다.

구체적인 도식 이해
만약 [10, 20, 30, 40]이라는 리스트가 있다면 이터레이터는 다음과 같이 동작한다.
이터레이터는 next()가 호출될 때마다 화살표를 다음 인덱스로 옮기며 해당 값을 반환한다. 화살표가 마지막 요소를 지나면 업무를 종료한다.
3. 이터러블과 이터레이터의 관계 (생성 및 소비)
두 개념은 '공장(Iterable)'과 '배송 트럭(Iterator)'의 관계와 같다. 공장이 있다고 물건이 저절로 전달되지 않듯, 이터러블에서 이터레이터를 뽑아내야 실제 순회가 가능하다.
# 1. 이터러블(공장) 생성
my_list = [10, 20]
# 2. 이터레이터(배송 트럭) 생성
# iter() 함수가 이터러블의 __iter__를 호출하여 이터레이터를 반환한다.
my_iter = iter(my_list)
# 3. 이터레이터가 요소를 하나씩 전달 (소비)
print(next(my_iter)) # 10을 가져오고 화살표를 다음으로 이동
print(next(my_iter)) # 20을 가져오고 화살표를 다음으로 이동
관계 설명: 이터러블은 이터레이터를 생성하는 역할을 하고, 이터레이터는 데이터를 실제로 소비하는 역할을 수행하며 서로 연결된다.
4. 'for' 루프의 실제 내부 코드
우리가 사용하는 for 루프는 사실 위에서 설명한 iter()와 next()를 자동화한 구문이다.
for 루프의 동작을 파이썬 코드로 구현하면:
my_list = [1, 2, 3]
it = iter(my_list) # 1. 이터레이터 획득
while True:
try:
item = next(it) # 2. 요소를 하나씩 꺼냄
print(item)
except StopIteration: # 3. 더 이상 꺼낼 게 없으면 예외 발생
break # 4. 루프 종료
이처럼 for 루프는 내부적으로 예외 처리(StopIteration)까지 포함된 정교한 이터레이터 소비 과정이다.
5. 커스텀 이터레이터 구현하기
클래스 내부에 매직 메서드를 구현하여 직접 이터레이터 프로토콜을 만들 수 있다.
class MyCounter:
def __init__(self, low, high):
self.current = low
self.high = high
def __iter__(self):
# 이터레이터 프로토콜에 따라 자기 자신(self)을 반환한다.
return self
def __next__(self):
# 현재 값이 최대값(high)보다 크면 반복을 중단한다.
if self.current > self.high:
raise StopIteration
else:
# 현재 값을 저장하고 포인터(current)를 1 증가시킨 뒤 반환한다.
# 이 과정이 위 도식에서 화살표가 옆으로 이동하는 원리이다.
self.current += 1
return self.current - 1
# 실행 결과
for i in MyCounter(1, 3):
print(i) # 1, 2, 3이 차례대로 출력된다.

Conclusion
결국 이터러블은 데이터를 담고 있는 주머니이고, 이터레이터는 그 주머니에서 데이터를 하나씩 꺼내주는 일꾼이다. 우리가 무심코 사용했던 'for' 루프는 사실 이 두 객체가 긴밀하게 협력하여 만들어낸 결과물이다.
매직 메서드 __iter__와 __next__의 관계를 이해했다면,
이제 파이썬의 반복 구조를 직접 설계하고 사용할 수 있게 될 것이다.
'Dev > Python' 카테고리의 다른 글
| 파이썬 심화: 클래스를 만드는 클래스, '메타클래스(Metaclass)' (0) | 2026.01.20 |
|---|---|
| 파이썬 중급: 클로저(Closure) 정리 (0) | 2026.01.19 |
| 파이썬 중급: 컨텍스트 매니저와 with 구문 완벽 이해하기 (0) | 2026.01.17 |
| 파이썬 중급 데코레이터 제너레이터 (0) | 2026.01.16 |
| 파이썬 중급: 클래스 정의부터 파이썬다운 객체지향 특징까지 완벽 정리 (0) | 2026.01.15 |