본문 바로가기
Design Pattern

16. 이터레이터 패턴 (Iterator pattern)

by 킹차니 2021. 12. 26.

이터레이터 패턴

집합 객체 내부 구조를 노출시키지 않고 순회하는 방법을 제공하는 패턴.

--> 집합 객체를 순회하는 클라이언트 코드를 변경하지 않고 다양한 순회 방법을 제공할 수 있다.

 


 

코드로 알아보기

Board는 Post들을 관리하는 객체이다. 클라이언트 코드를 먼저 보자.

 

Board

 

Post

 

❗️문제점 ❗️

현재 클라이언트 코드를 보면 board의 post들에 접근하기 위해 board의 Posts가 List타입임을 클라이언트가 알아야한다. 이를 클라이언트가 몰라도 되도록 이터레이터 패턴을 적용하여 수정해보자.

 

클라이언트에게 Collection이 아닌 Iterator타입을 전달하기 위해서는 자바의 Iterator 인터페이스를 구현하면 된다.

작성일 최신 순인 post iterator를 만들어보자.

 

RecentPostIterator

생성자에서 sort()를 사용하여 posts를 최근에 생성된 순으로 정렬해주는 것을 볼 수 있다.

 

이제 Client는 자바의 Iterator를 사용하는 것처럼 사용하면 된다.

 

실행결과:

 


 

장점과 단점

 

장점

1. 집합 객체가 가지고 있는 객체들에 손쉽게 접근할 수 있다. (집합구조가 Map이든, List이든, Set이든 전혀 몰라도 된다.)

2. 일관된 인터페이스를 사용해 여러 형태의 집합 구조를 순회할 수 있다.

 

단점

클래스가 늘어나고 복잡도가 증가한다.

 

 


 

실제로 어디에 사용되나

 

 

1. java.util.Enumeration과 java.util.Iterator

Enumeration

(하지만 Enumeration보다는 Iterator를 많이 쓴다.)

 

추가로 Iterator에서 순회시에는 반복문을 사용하여 순회하였다.

하지만 자바8부터는 forEachRemaing에 Consumer 람다식을 사용하여 한 줄로도 순회할 수 있다.

 

2. StAX

xml파일:

실행결과:

 

 

3. 스프링의 CompositeIterator

 

 

출처: 인프런 백기선님 '코딩으로 학습하는 GoF 강의'
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4