Hello

[디자인 패턴] - Iterator

by 볼빵빵오춘기

Iterator

컬렉션(리스트, 집합 등)의 내부 구조를 노출하지 않고, 요소들을 순차적으로 접근할 수 있게 하는 디자인 패턴이다.

즉, 컬렉션 내부를 직접 건드리지 않고도 반복해서 데이터를 순회할 수 있게 해준다.

 

예시 코드

// 1. Iterator 인터페이스
interface Iterator<T> {
boolean hasNext();
T next();
}
// 2. Aggregate(컬렉션) 인터페이스
interface Aggregate<T> {
Iterator<T> createIterator();
}
// 3. 구체적 컬렉션 클래스
class BookShelf implements Aggregate<String> {
private List<String> books = new ArrayList<>();
public void addBook(String name) {
books.add(name);
}
public String getBookAt(int index) {
return books.get(index);
}
public int getLength() {
return books.size();
}
public Iterator<String> createIterator() {
return new BookShelfIterator(this);
}
}
// 4. 구체적 반복자 클래스
class BookShelfIterator implements Iterator<String> {
private BookShelf bookShelf;
private int index = 0;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
}
public boolean hasNext() {
return index < bookShelf.getLength();
}
public String next() {
return bookShelf.getBookAt(index++);
}
}
// 5. 클라이언트 코드
public class IteratorPatternExample {
public static void main(String[] args) {
BookShelf shelf = new BookShelf();
shelf.addBook("Design Patterns");
shelf.addBook("Refactoring");
shelf.addBook("Clean Code");
Iterator<String> it = shelf.createIterator();
while (it.hasNext()) {
System.out.println("* " + it.next());
}
}
}

 

Iterator 패턴의 장점

캡슐화 유지

컬렉션 내부 구조를 숨기고, 안전하게 순회 가능하다.

 

일관된 순회 방식 제공

다양한 자료구조(배열, 리스트 등)를 동일한 방법으로 순회 가능하다.

 

다양한 반복 구현 가능

정방향, 역방향, 필터링된 순회 등 커스텀 Iterator 제작 가능하다.

 

책임 분리

컬렉션과 반복 로직을 분리해 유지보수 용이하다.

 

Iterator 패턴의 단점

성능 저하 가능성

많은 요소를 반복할 경우 오버헤드 발생한다.

 

간단한 자료구조에는 과도한 설계

단순 리스트라면 굳이 Iterator를 따로 만들 필요 없다.

 

복잡한 반복 로직은 구현 난이도 ↑

역순, 조건부 순회 등을 구현하려면 추가 코드가 필요하다.

 

Iterator 패턴은 언제 사용하나?

자료구조의 내부 구조를 숨기고 싶을 때

List, Set, Stack 등 다양한 컬렉션 순회

 

복잡한 순회 방식이 필요할 때

필터된 요소만 순회, 페이지 단위 처리 등

 

객체 컬렉션을 외부에서 순회할 때

MVC 패턴에서 Model의 데이터를 View에서 반복 출력 등

 

정리하자면

컬렉션의 구조를 숨기고 안전하고 일관된 방식으로 요소를 순회할 수 있게 해주는 패턴이다.

블로그의 프로필 사진

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기