Iterator 디자인 패턴은 컬렉션의 요소를 순차적으로 접근하여 반복 작업을 수행하는 패턴입니다. 이 패턴을 사용하면 컬렉션의 내부 표현을 노출하지 않고도 요소에 접근할 수 있습니다.
Iterator 디자인 패턴의 구성요소
1. Aggregate(집합체)
Aggregate는 여러 개의 객체를 모아놓은 집합체를 나타내는 인터페이스입니다. 주로 컬렉션을 나타내며, 집합체에 대한 반복자를 생성하는 메서드를 제공합니다.
2. ConcreteAggregate(구체적인 집합체)
ConcreteAggregate는 Aggregate 인터페이스를 구현한 구체적인 집합체입니다. 이 클래스는 실제로 객체를 추가하거나 제거하는 등의 기능을 구현합니다.
3. Iterator(반복자)
Iterator는 집합체의 요소를 순차적으로 접근하기 위한 인터페이스를 정의합니다. 요소를 순서대로 접근하거나, 특정 요소의 인덱스로 이동하는 등의 기능을 제공합니다.
4. ConcreteIterator(구체적인 반복자)
ConcreteIterator는 Iterator 인터페이스를 구현한 구체적인 반복자입니다. 이 클래스는 실제로 반복 작업을 수행하거나 현재 위치를 유지하는 등의 기능을 구현합니다.
Swift에서의 Iterator 활용 예제
protocol Iterator {
associatedtype T
func hasNext() -> Bool
func next() -> T
}
protocol Aggregate {
associatedtype T
func createIterator() -> Iterator<T>
}
class ConcreteIterator<T>: Iterator {
private var position: Int = 0
private let elements: [T]
init(elements: [T]) {
self.elements = elements
}
func hasNext() -> Bool {
return position < elements.count
}
func next() -> T {
defer { position += 1 }
return elements[position]
}
}
class ConcreteAggregate<T>: Aggregate {
private var elements: [T] = []
func createIterator() -> Iterator<T> {
return ConcreteIterator(elements: elements)
}
func add(element: T) {
elements.append(element)
}
}
let aggregate = ConcreteAggregate<Int>()
aggregate.add(element: 1)
aggregate.add(element: 2)
aggregate.add(element: 3)
let iterator = aggregate.createIterator()
while iterator.hasNext() {
print(iterator.next())
}
위 예제는 Swift에서 Iterator 디자인 패턴을 구현한 것으로, Aggregate와 Iterator 인터페이스를 정의하고, 이를 구체적으로 구현하는 ConcreteAggregate와 ConcreteIterator 클래스를 포함하고 있습니다. 또한, Aggregate를 이용하여 ConcreteAggregate를 생성하고, 반복자를 통해 집합체의 요소를 순차적으로 접근하는 예제를 보여줍니다.
결론
Iterator 디자인 패턴은 컬렉션의 내부 구조에 독립적으로 요소를 접근하고 반복 작업을 수행할 수 있도록 도와줍니다. 이를 통해 코드의 유연성과 확장성이 향상되며, 특히 Swift와 같이 컬렉션을 다루는 언어에서 유용하게 활용될 수 있습니다.
참고 자료: The Swift Programming Language - Collection Types