핵심 요약
• Iterable 은 반복이 가능한 객체로, for 루프와 함께 사용할 수 있는 객체입니다. __iter__() 메서드를 가지고 있으며, 이를 통해 iterator 객체를 반환합니다. Iterator 는 반복 작업을 실제로 수행하는 객체로, __next__() 메서드를 사용해 순차적으로 값을 반환합니다. 더 이상 반환할 값이 없을 때 StopIteration 예외를 발생시킵니다. 즉, Iterable 객체가 실제 반복 작업으로 값을 반환하기 위해서 Iterator 객체를 사용한다고 보시면 되겠습니다.
Iterable과 Iterator의 자세한 차이
1. 정의
• Iterable은 반복이 가능한 객체로 리스트, 튜플, 문자열과 같은 Python의 기본 자료형들은 모두 iterable입니다. __iter__() 메서드를 통해 iterator를 반환하기 때문에 어떤 객체가 Iterable 인지 아닌지를 판단하기 위해서는 아래와 같은 방법들로 해당 메서드 존재여부를 확인해 보시면 됩니다.
t = 'ABCDE' #문자열은 iterable
print(dir(t)) #내부함수를 리스트로 표현. 목록에 __iter__ 확인
print(hasattr(t,'__iter__')) #True
from collections import abc #abc는 추상클래스
print(isinstance(t,abc.Iterable)) #True
• Iterator는 __iter__()와 __next__() 메서드를 모두 구현하는 객체로, 반복 가능한 값을 차례로 반환하고, 반환할 값이 없으면 StopIteration 예외를 발생시켜 반복을 종료합니다. iter 함수와 next() 함수를 사용하여 이를 증명해 볼 수 있습니다.
t = 'ABCDE' #iterable 문자열
it = iter(t) #iterator 생성
while True:
try:
print(next(it))
except StopIteration:
break
#output :
A
B
C
D
E
즉, for loop를 사용하면 위와 같은 실행이 내부적으로 반복 수행된다고 보시면 됩니다.
동작 원리
• Iterable 객체는 __iter__() 메서드로 iterator를 생성하고, 생성된 iterator를 통해 순차적으로 값을 조회합니다.
• Iterator는 __next__() 메서드를 호출할 때마다 다음 값을 반환하며, 끝에 도달하면 StopIteration을 발생시킵니다.
다만, Iterable은 반복가능한 객체를 의미하기 때문에 몇 번이고 For loop를 돌려서 값을 빼올 수 있지만, Iterator 는 iterable 객체가 반복 수행을 위해 일회성으로 만들어주는 객체이기 때문에 StopIteration이 발생한 이후에는 더 반복을 할 수가 없습니다.
t = 'ABCDE' #iterable
for c in t:
print('1:',c) #1:A 1:B 1:C 1:D 1:E
for c in t:
print('2:',c) #2:A 2:B 2:C 2:D 2:E
it = iter(t) #iterator
for c in it:
print('1:',c) #1:A 1:B 1:C 1:D 1:E
for c in it:
print('2:',c) #No output
이는 사용자 정의 Iterator를 사용하여도 동일하게 적용됩니다.
# Iterator 예제: 사용자 정의 iterator
class Counter:
def __init__(self, max_count):
self.max_count = max_count
self.current = 1
def __iter__(self):
return self # 스스로를 iterator로 반환
def __next__(self):
if self.current <= self.max_count:
result = self.current
self.current += 1
return result
else:
raise StopIteration # 반복 종료
# Counter iterator 생성 및 사용
counter = Counter(3)
for count in counter:
print('1:',count) #1:A 1:B 1:C 1:D 1:E
for count in counter:
print('2:',count) #No output
결론:
Iterable은 반복 가능한 객체를 의미하며, iterator는 이러한 iterable 객체에서 요소를 하나씩 가져오는 데 사용됩니다. iterable은 iterator를 반환할 수 있으며, iterator는 실제로 값을 순차적으로 반환하는 역할을 담당합니다. 이 두 개념은 Python에서 반복 작업을 유연하고 효율적으로 수행하는 핵심 요소입니다.