본문 바로가기
CS/Python

[python3] 파이썬에서 이터레이터 (Iterator) 란?

by Warehaus 2022. 11. 3.

 

 

 

 

Iterator

 

우선 이터레이터라는 단어는 디자인 패턴에서 많이 듣는다.

Iterator pattern

 

Single Responsible Principle 을 준수하기 위해 데이터의 저장과 방문의 책임을 분리하여 방문의 책임만을 갖게 하는 패턴을 의미한다.

 

일반적으로 이 의미와 어느정도 유사한 느낌은 있지만

언어적인 측면에서는 여러개의 값들을 가지고 있는 객체를 의미하는 경우가 대부분이다.

 

단순하게 생각해서, 모든 값들을 순회(Traverse)할 수 있는 객체를 Iterator로 이해하면 되겠다.

 

Python에서의 Iterator는 __iter__(), __next__() 메서드를 포함하는 객체를 의미한다.

 

 

Iterable objects

 

Python 에서 iterable한 자료형인

List, tuple, dictionary, set 이 있다.

 

이들은 iterator 형식으로 iterable 한 컨테이너 이다.

 

iterate 의 사전적 의미는 반복하다 이다.

 

 

 

Iterator의 사용

 

이제 어떤 것들이 Iterator인지 알았으니 어떻게 쓰는지 보도록 한다.

예제 코드는 아래처럼 작성 해 보았다.

 

list = [ 1, 2, 3, 4, 5 ]

for item in list:
    print( item )

d = { "A" : 1, "B" : 2 }

for k, v in d.items():
    print( k, v )

t = ( "a", "b" )

for item in t:
    print( item )

 

위 코드를 실행하면 아래처럼 iterator 를 순회하여 print 하는 것을 보여준다.

 

> python3 iterator.py 
1
2
3
4
5
A 1
B 2
a
b

 

그냥 봤을 때 뭐가 iterator 인지 잘 모를 수 밖에 없다. 그냥 배열 같은 자료구조를 루프도는거 아닌가? 정도로 추상적으로 생각할 수 있지만 내부적으로는 그렇지 않다.

 

for loop 를 사용하였을 때, list, dictionary 같은 iterable 자료구조를 iterator 객체로 만들어 준 뒤, 그 다음에 순회하면서 데이터를 출력하는 것이다.

 

어떻게 동작하는지 하나하나 보기 위한 코드는 다음과 같다.

 

 

list = [ 1, 2, 3, 4, 5 ]
l = iter(list)

while True:
    print(next(l))

 

list를  iter 객체로 만들어 준다.

그리고 우리는  앞에서 __next__()  메서드에 대한 언급이 잠깐 있었던 것을 기억 할 것이다.

이를 통해 다음처럼 리스트 안의 값을 순차적으로 방문이 가능하다.

 

> python3 iterator.py 
1
2
3
4
5
Traceback (most recent call last):
  File "/Users/armincho/toy_projects/python3_study/iterator.py", line 9, in <module>
    print(next(l))
StopIteration

 

에러가 났다.

 

코드의 while문을 일부러 중단없이 돌려 보았고 이를 통해 next 메서드를 list의 끝까지 수행하였을 때 발생하는 Exception을 확인 해 보았다.

 

작성하는 코드에 따라 예외처리를 해도 되고, 리스트의 크기를 이용하여 방문을 제한하여도 될 것이다.

 

 

 

마치며

 

오늘은 간단히 Iterable 한 자료형을 Iterator 객체로 만들어 사용하는 방법을 알아 보았다.

Iterator개념은 다른 언어에서도 너무나 널리 쓰이는 개념이니 만큼

알아두면 두고두고 잘 쓸 수 있을 것이다.

 

물론.. C에서 언어를 시작한 사람이라면

index 접근이랑 무엇이 다르냐 .. 라고 할  수 있겠으나

데이터의 끝까지 갔을때 이상한 주소를 건드려서 Segmentation Fault를 보게 된다면 .. Iterator가 왜 소중한 지 알게 되지 않을 까 싶다.