본문 바로가기

설계

[디자인 패턴] 반복자 패턴 (Iterator Pattern) - python 예제 코드

Iterator Pattern은 컬렉션에 저장된 요소를 순차적으로 접근하기 위한 디자인 패턴입니다. 이 패턴은 컬렉션과 반복 작업을 분리하여, 클라이언트 코드에서는 요소를 반복적으로 처리하는 로직만 작성하면 됩니다.

 


1. 구성요소

 

  • Iterator: 요소를 순차적으로 접근하기 위한 인터페이스를 제공합니다. 다음 요소에 접근하기 위한 next() 메서드와, 현재 요소의 존재 여부를 확인하기 위한 hasNext() 메서드가 포함됩니다.
  • ConcreteIterator: Iterator 인터페이스를 구현하는 클래스입니다. 컬렉션에 대한 반복 작업을 수행합니다.
  • Aggregate: 컬렉션의 인터페이스를 제공합니다. 요소를 추가하거나 삭제하는 메서드가 포함됩니다.
  • ConcreteAggregate: Aggregate 인터페이스를 구현하는 클래스입니다. Iterator 인터페이스를 구현하는 ConcreteIterator 객체를 반환하는 메서드가 포함됩니다.

 

2. 예제 코드

 

이제 Python 코드 예제를 통해 Iterator Pattern을 살펴보겠습니다. 아래는 리스트(List) 컬렉션에 대한 Iterator Pattern을 구현한 코드입니다.

 

class ListIterator:
    def __init__(self, lst):
        self._list = lst
        self._index = 0

    def next(self):
        if not self.has_next():
            return None
        item = self._list[self._index]
        self._index += 1
        return item

    def has_next(self):
        return self._index < len(self._list)

class ListCollection:
    def __init__(self):
        self._list = []

    def add_item(self, item):
        self._list.append(item)

    def iterator(self):
        return ListIterator(self._list)


위 코드에서 ListIterator는 Iterator 인터페이스를 구현하며, next() 메서드와 has_next() 메서드를 제공합니다. ListCollection은 Aggregate 인터페이스를 구현하며, 컬렉션에 대한 반복 작업을 위해 iterator() 메서드를 제공합니다.

이제 이 Iterator Pattern을 사용하여 리스트(List) 컬렉션의 요소를 반복적으로 처리해보겠습니다.

 

collection = ListCollection()
collection.add_item("apple")
collection.add_item("banana")
collection.add_item("orange")

iterator = collection.iterator()

while iterator.has_next():
    item = iterator.next()
    print(item)


위 코드에서 ListCollection 객체를 생성하고, add_item() 메서드를 사용하여 요소를 추가합니다. iterator() 메서드를 사용하여 ListIterator 객체를 생성합니다.

그리고 while 루프를 사용하여 iterator.hasNext()가 True인 동안, iterator.next()를 호출하여 각 요소를 처리합니다. 이 코드를 실행하면 리스트(List) 컬렉션의 모든 요소를 출력할 수 있습니다.

Iterator Pattern을 사용하면 클라이언트 코드는 컬렉션의 내부 구현에 대해 신경쓰지 않고, 간단하게 요소를 처리할 수 있습니다. 또한 Iterator와 Aggregate 인터페이스를 구현하는 클래스를 추가하거나 변경하여, 다른 컬렉션에 대해서도 동일한 반복 작업을 수행할 수 있습니다.

Iterator Pattern은 Python에서 매우 자주 사용되는 패턴 중 하나입니다. 예를 들어, 파이썬 내장 함수인 iter()와 next() 함수는 Iterator Pattern의 구현체입니다. 또한 Python의 다양한 컬렉션 타입(예: 리스트, 튜플, 딕셔너리 등)도 Iterator Pattern을 사용하여 요소를 반복 처리합니다.

Iterator Pattern은 반복 작업을 수행하는데 유용한 패턴이지만, 컬렉션의 크기가 매우 큰 경우에는 성능 이슈가 발생할 수 있습니다. 이 경우에는 다른 반복 패턴을 고려해볼 필요가 있습니다.

 

3. 장점


1) 단일 책임 원칙(Single Responsibility Principle)을 준수 합니다.

Iterator Pattern은 컬렉션에서 요소를 반복하는 작업을 분리하여, 요소 처리 코드와 컬렉션 코드를 분리합니다. 이는 코드의 가독성을 높이고, 유지보수성을 향상시킵니다.

2) 확장성이 높습니다.

Iterator Pattern은 Iterator와 Aggregate 인터페이스를 구현하는 클래스를 추가하거나 변경하여, 다른 컬렉션 타입에 대해서도 반복 작업을 수행할 수 있습니다.

3) 클라이언트 코드를 단순화합니다.

Iterator Pattern은 클라이언트 코드에서 요소를 반복적으로 처리하는 로직만 작성하면 됩니다. 이는 코드의 복잡성을 줄이고, 코드의 재사용성을 높입니다.


4. 단점


1) 성능 이슈가 발생할 수 있습니다.

Iterator Pattern은 컬렉션의 모든 요소를 순차적으로 접근하기 때문에, 컬렉션의 크기가 매우 큰 경우에는 성능 이슈가 발생할 수 있습니다.

2) 추가적인 클래스를 만들어야 합니다.

Iterator Pattern은 Iterator와 Aggregate 인터페이스를 구현하는 클래스를 추가적으로 작성해야 합니다. 이는 코드의 복잡성을 높일 수 있습니다.

Iterator Pattern은 컬렉션의 요소를 반복 처리할 때 유용한 패턴입니다. 하지만 컬렉션의 크기가 매우 큰 경우나, 추가적인 클래스를 만들어야 할 때는 다른 패턴을 고려해볼 필요가 있습니다.