반복자 패턴(Iterator Pattern)은 컬렉션(Collection)의 내부 표현을 노출하지 않고도, 컬렉션의 요소들에 하나씩 접근할 수 있도록 해주는 행위(Behavioral) 패턴이다.
이를 통해 반복 작업을 수행하는 코드를 캡슐화하여, 컬렉션 객체와 별개로 요소를 순회하는 방법을 제공한다.
컬렉션 데이터를 순회해야 하는 경우, 이를 직접 구현하면 컬렉션 구조가 변경될 때마다 관련 코드가 수정되어야 하는 문제가 발생할 수 있다.
반복자 패턴은 이러한 문제를 해결하기 위해 다음과 같은 이점을 제공한다:
예를 들어, 리스트(List), 집합(Set), 스택(Stack) 등 여러 형태의 데이터 구조를 처리하는 프로그램에서 반복자 패턴을 사용하면,
컬렉션의 종류와 상관없이 동일한 방식으로 데이터 구조를 순회할 수 있다.
Aggregate Iterator
+ +
| |
ConcreteAggregate ConcreteIterator
+ +
+--------------------------+
Collection
다음 예시에서는 간단한 숫자 리스트를 순회하는 반복자 패턴을 Java로 구현해 보겠다.
// Iterator 인터페이스
interface Iterator {
boolean hasNext();
int next();
}
// ConcreteIterator 클래스
class NumberIterator implements Iterator {
private int[] numbers;
private int position = 0;
public NumberIterator(int[] numbers) {
this.numbers = numbers;
}
@Override
public boolean hasNext() {
return position < numbers.length;
}
@Override
public int next() {
if (!hasNext()) {
throw new IllegalStateException("더 이상 요소가 없습니다.");
}
return numbers[position++];
}
}
// Aggregate 인터페이스
interface Collection {
Iterator createIterator();
}
// ConcreteAggregate 클래스
class NumberCollection implements Collection {
private int[] numbers;
public NumberCollection(int[] numbers) {
this.numbers = numbers;
}
@Override
public Iterator createIterator() {
return new NumberIterator(numbers);
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
Collection numberCollection = new NumberCollection(numbers);
Iterator iterator = numberCollection.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
hasNext()
와 next()
를 정의한다.Iterator
를 구현하여, 숫자 배열의 각 요소를 순회하는 기능을 제공한다.createIterator()
메서드를 정의한다.Collection
을 구현하며, 구체적인 데이터 구조와 반복자를 관리한다.1
2
3
4
5
반복자 패턴(Iterator Pattern)은 컬렉션 요소를 순회하는 코드를 캡슐화하여, 데이터 구조와 독립적인 순회 방식을 제공한다.
이 패턴을 활용하면 데이터 구조와 순회 방식을 분리하여 유연성을 높일 수 있으며, 다양한 데이터 구조를 일관되게 처리할 수 있다.
아래 글에서 다른 디자인 패턴들을 확인할 수 있다.
디자인 패턴 모음