이터레이터 디자인 패턴은 컬렉션(또는 구조체)의 요소를 반복적으로 접근할 수 있는 인터페이스를 제공하는 디자인 패턴입니다. 이터레이터를 사용하면 컬렉션의 내부 구조에 상관없이 요소에 접근할 수 있으며, 반복 작업을 더욱 효과적으로 처리할 수 있습니다.
이터레이터 디자인 패턴을 사용하는 이유
이터레이터 디자인 패턴을 사용하는 주요한 이유는 다음과 같습니다:
-
분리된 로직: 이터레이터를 사용하면 요소에 대한 접근 로직을 분리할 수 있습니다. 컬렉션의 내부 구조가 변경되더라도 이터레이터의 구현은 변경되지 않기 때문에 유지보수가 용이합니다.
-
단일 인터페이스: 이터레이터를 사용하면 다양한 종류의 컬렉션에 대해 일관된 인터페이스를 제공할 수 있습니다. 이는 클라이언트 코드의 복잡도를 낮추고 코드 재사용성을 높이는 데 도움이 됩니다.
-
세부 사항 감추기: 이터레이터는 요소에 대한 접근 방법을 캡슐화하므로 클라이언트 코드에서 내부 구조에 대해 알 필요가 없습니다. 이는 구현 세부 사항을 감추고 코드의 유연성과 가독성을 높이는 데 도움이 됩니다.
이터레이터 디자인 패턴의 구조
이터레이터 디자인 패턴은 다음과 같은 구성 요소로 구성됩니다:
-
이터레이터 (Iterator): 컬렉션의 요소를 한 번에 하나씩 열거하기 위한 인터페이스를 정의합니다. 이터레이터는 다음 요소로 진행하는 메서드인
next()
를 제공합니다. -
컬렉션 (Collection): 이터레이터를 생성하는 메서드를 포함하는 컬렉션 객체를 정의합니다. 컬렉션은
create_iterator()
메서드를 통해 이터레이터를 생성하고 반환합니다. -
컨크리트 이터레이터 (Concrete Iterator): 이터레이터 인터페이스를 구현하며, 실제로 요소에 접근하고 열거하는 동작을 수행합니다. 각각의 요소에 접근하기 위해 컬렉션의 내부 구조에 접근할 수도 있습니다.
이터레이터 디자인 패턴의 예제
class Iterator:
def __init__(self, collection):
self.collection = collection
self.index = 0
def has_next(self):
return self.index < len(self.collection)
def next(self):
if self.has_next():
item = self.collection[self.index]
self.index += 1
return item
class Collection:
def __init__(self):
self.items = []
def add_item(self, item):
self.items.append(item)
def create_iterator(self):
return Iterator(self.items)
위의 예제 코드에서 Iterator
클래스는 이터레이터 인터페이스를 구현합니다. has_next()
메서드는 다음 요소가 있는지 확인하고, next()
메서드는 다음 요소로 진행하여 현재 요소를 반환합니다.
Collection
클래스는 컬렉션 객체를 정의하며, add_item()
메서드를 사용하여 요소를 추가할 수 있습니다. create_iterator()
메서드를 사용하여 이터레이터를 생성하고 반환합니다.
이제 이터레이터 디자인 패턴을 사용하여 컬렉션에서 요소를 반복하는 것이 간단해졌습니다.
collection = Collection()
collection.add_item("Apple")
collection.add_item("Banana")
collection.add_item("Orange")
iterator = collection.create_iterator()
while iterator.has_next():
print(iterator.next())
위의 예제 코드에서 컬렉션에 세 가지 요소를 추가하고, 이터레이터를 생성합니다. has_next()
메서드를 통해 다음 요소가 있는지 확인하고, next()
메서드를 통해 다음 요소로 진행하면서 현재 요소를 출력합니다.
이처럼 이터레이터 디자인 패턴은 컬렉션의 요소를 반복적으로 접근할 수 있는 간편하고 유연한 방법을 제공합니다. 이를 통해 코드의 유지 및 재사용성을 높일 수 있습니다.