이터레이터(Iterator) 패턴
디자인 패턴 ·이터레이터 패턴은 컨테이너 객체의 요소에 순차적으로 접근하는 데 사용되는 디자인 패턴입니다. 이 패턴은 컨테이너 객체의 내부 구현을 노출시키지 않고도 컨테이너 객체의 요소에 접근할 수 있도록 합니다.
구성 요소
- 어그리게이트(Aggregate): 반복자객체를 생성하기위한 인터페이스
- 이터레이터(Iterator): 요소에 접근 할 수 있고 순회 할 수 있는 인터페이스
구현:
- Iterator 인터페이스를 정의합니다.
- Iterator 클래스를 생성하고 Iterator 인터페이스를 구현합니다.
- next() 메서드를 구현하여 컨테이너의 다음 요소를 반환합니다.
- hasNext() 메서드를 구현하여 컨테이너에 다음 요소가 있는지 여부를 확인합니다.
- 컨테이너 클래스에서 iterator() 메서드를 제공하여 이터레이터를 생성합니다.
장점
- 컨테이너 객체의 내부 구현을 노출시키지 않고도 컨테이너 객체의 요소에 접근할 수 있습니다.
- 코드 재사용성이 증가합니다.
- 유지 보수성이 향상됩니다.
단점
- 이터레이터 클래스를 추가하면 약간의 성능 저하가 발생할 수 있습니다.
- 이터레이터 클래스가 많아질 경우 코드 복잡성이 증가할 수 있습니다.
예시
Post 목록을 가지고 있는 Board에서 최신 Post 목록을 순회해야한다.
Iterator
java.util.Iterator
Aggregate
public class Board {
List<Post> posts = new ArrayList<>();
public List<Post> getPosts() {
return posts;
}
public void setPosts(List<Post> posts) {
this.posts = posts;
}
public void addPost(String content) {
this.posts.add(new Post(content));
}
public Iterator<Post> getIterator() {
return posts.iterator();
}
public Iterator<Post> getRecentIterator() {
posts.sort((p1, p2) -> p2.getCreatedDateTime().compareTo(p1.getCreatedDateTime()));
return posts.iterator();
}
}
Client
class BoardTest {
@Test
public void board_test() {
Board board = new Board();
board.addPost("디자인 패턴 게임");
board.addPost("선생님, 저랑 디자인 패턴 하나 학습하시겠습니까?");
board.addPost("지금 이 자리에 계신 여러분들은 모두 디자인 패턴을 학습하고 계신 분들입니다.");
// 가장 최신 글 먼저 순회하기
Iterator<Post> recentIterator = board.getRecentIterator();
recentIterator.forEachRemaining(p-> System.out.println(p.getTitle()));
}
}
결론
이터레이터 패턴은 컨테이너 객체의 요소에 순차적으로 접근하는 데 유용한 디자인 패턴입니다. 컨테이너 객체의 내부 구현을 노출시키지 않고도 컨테이너 객체의 요소에 접근할 수 있습니다. 그러나 이터레이터 클래스 추가로 인한 성능 저하와 코드 복잡성에 주의해야 합니다.
예제는 이곳 에서 확인하실수 있습니다.