[python] 이터레이터 디자인 패턴

이터레이터 디자인 패턴은 컬렉션(또는 구조체)의 요소를 반복적으로 접근할 수 있는 인터페이스를 제공하는 디자인 패턴입니다. 이터레이터를 사용하면 컬렉션의 내부 구조에 상관없이 요소에 접근할 수 있으며, 반복 작업을 더욱 효과적으로 처리할 수 있습니다.

이터레이터 디자인 패턴을 사용하는 이유

이터레이터 디자인 패턴을 사용하는 주요한 이유는 다음과 같습니다:

  1. 분리된 로직: 이터레이터를 사용하면 요소에 대한 접근 로직을 분리할 수 있습니다. 컬렉션의 내부 구조가 변경되더라도 이터레이터의 구현은 변경되지 않기 때문에 유지보수가 용이합니다.

  2. 단일 인터페이스: 이터레이터를 사용하면 다양한 종류의 컬렉션에 대해 일관된 인터페이스를 제공할 수 있습니다. 이는 클라이언트 코드의 복잡도를 낮추고 코드 재사용성을 높이는 데 도움이 됩니다.

  3. 세부 사항 감추기: 이터레이터는 요소에 대한 접근 방법을 캡슐화하므로 클라이언트 코드에서 내부 구조에 대해 알 필요가 없습니다. 이는 구현 세부 사항을 감추고 코드의 유연성과 가독성을 높이는 데 도움이 됩니다.

이터레이터 디자인 패턴의 구조

이터레이터 디자인 패턴은 다음과 같은 구성 요소로 구성됩니다:

  1. 이터레이터 (Iterator): 컬렉션의 요소를 한 번에 하나씩 열거하기 위한 인터페이스를 정의합니다. 이터레이터는 다음 요소로 진행하는 메서드인 next()를 제공합니다.

  2. 컬렉션 (Collection): 이터레이터를 생성하는 메서드를 포함하는 컬렉션 객체를 정의합니다. 컬렉션은 create_iterator() 메서드를 통해 이터레이터를 생성하고 반환합니다.

  3. 컨크리트 이터레이터 (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() 메서드를 통해 다음 요소로 진행하면서 현재 요소를 출력합니다.

이처럼 이터레이터 디자인 패턴은 컬렉션의 요소를 반복적으로 접근할 수 있는 간편하고 유연한 방법을 제공합니다. 이를 통해 코드의 유지 및 재사용성을 높일 수 있습니다.

참고 자료