티스토리 뷰

시리즈/Stream Processing

iterator 패턴

빅또리 2022. 7. 31. 00:57

iterator 패턴

자료구조 (list, tree, stack..)를 노출하지 않고 추상화시켜서 collection의 요소를 traverse하는 패턴.

메인 아이디어

collection의 traverse behavior를 iterator라는 분리된 객체로 뽑아내기

iterator 객체에 traverse 알고리즘을 구현해두고, 외부에서는 그 디테일을 알 수 없도록 은닉한다.

여러 iterator를 사용하면, 같은 collection을 동시에 독립적으로 탐색할 수도 있다.

모든 iterator는 같은 인터페이스를 구현해서, client code가 어떤 자료구조의 collection이든, 어떤 traverse 알고리즘이든 호환 가능하게 만들어져야 한다.

보통 더이상 element가 없을 때까지 (traverse를 완료할 때까지, hasMore) element 하나씩 fetch 해오는 (getNext) 방식의 인터페이스를 구현할 것이다.

🦁 각종 언어에서 나오는 iterable, iterator 개념도 이런식이다!

iterable : iterator를 반환할 수 있는 객체 (예를 들면 javascript에서는 [Symbol.iterator] 메소드로 호출, python에서는 __iter__ 메소드로 호출 / 대부분의 언어에서 for...of 와 같은 syntax는 이터러블 객체와 관련되어 있다. )

iterator: 다음 element를 리턴하거나 traverse가 끝났음을 알리는 next 메소드가 구현되어 있는 객체

 

🐯 여기서 generator를 활용한다면 모든 element를 메모리에 올려놓고 시작하는 것이 아니라, 필요한 때에 하나씩 가져오는(계산하는) lazy한 이터러블을 만들 수 있다.

 

 

실전 활용 예시

페이스북이라는 소셜 네트워크에서 프로필 탐색하기

친구 탐색하는 iterator, 직장 동료를 탐색하는 iterator.

클라이언트 코드에는 authentication이나 REST request 같은 탐색 디테일을 은닉하고 동일한 인터페이스를 구현한 어떤 소셜 네트워크로든 쉽게 교체할 수 있도록 만든다.

페이스북으로 프로필을 탐색해 스팸 메세지를 보내는 application

 

이 패턴을 적용하면 좋을 케이스

- collection의 자료구조가 너무 복잡한데, 클라이언트 코드에는 그 디테일을 은닉하고 싶을 때

(client의 부주의하거나, 잘못된 액션으로 인한 원본 오염도 막을 수 있다 / 여러 iterator, collection에 대한 제너릭 인터페이스 제공)

- 중복되는 traversal code 줄이기. 비지니스 로직과 분리

 

댓글
공지사항
최근에 올라온 글