컬렉션(Collection)에 저장된 객체들(요소들)에 직접적인 내부 구조를 몰라도 순차적으로 접근할 수 있게 하는 디자인 패턴
컬렉션 내부 구조를 노출하지 않아도 된다.
List, Set, Map처럼 구조가 달라도 같은 방식(hasNext(), next())으로 순회할 수 있다.
| 구성요소 | 설명 |
|---|---|
| Iterator (반복자) | 요소를 하나씩 꺼내는 역할 (next() 등) |
| Concrete Iterator | 실제 이터레이터 구현체 |
| Aggregate (집합체) | 요소들의 모음 (컬렉션) |
| Concrete Aggregate | 실제 컬렉션 구현체 (리스트, 트리 등) |
hasNext(), next() 등의 메소드로 컬렉션 내부의 각 요소를 순서대로 접근한다. // 1. Iterator 인터페이스
interface Iterator {
boolean hasNext();
Object next();
}
// 2. Aggregate (집합체) 인터페이스
interface Aggregate {
Iterator createIterator();
}
// 3. ConcreteAggregate (구체적인 컬렉션)
class NameRepository implements Aggregate {
private String[] names = {"Tom", "Jerry", "Mickey", "Donald"};
@Override
public Iterator createIterator() {
return new NameIterator();
}
// 내부 이터레이터 클래스
private class NameIterator implements Iterator {
int index = 0;
@Override
public boolean hasNext() {
return index < names.length;
}
@Override
public Object next() {
if (this.hasNext()) {
return names[index++];
}
return null;
}
}
}
// 4. 클라이언트 코드
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository repository = new NameRepository();
Iterator iter = repository.createIterator();
while (iter.hasNext()) {
String name = (String) iter.next();
System.out.println("Name: " + name);
}
}
}