디자인패턴

디자인패턴 - 이터레이터 패턴

traveler_JH 2024. 12. 17. 00:59

이터레이터 패턴 (Iterator Pattern)

    • 컬렉션(리스트, 집합, 트리 등) 내의 요소를 순차적으로 접근하면서도 컬렉션의 내부 구조를 노출하지 않도록 하는 디자인 패턴
    • 이 패턴은 반복자(Iterator) 객체를 제공하여 데이터를 순회

이터레이터 패턴의 핵심

  • 내부 구조 은닉
    • 컬렉션의 내부 구현을 알 필요 없이, 외부에서 동일한 방식으로 데이터를 순회할 수 있게 한다.
  • 순회 책임 분리
    • 컬렉션 클래스는 데이터 저장과 관리에 집중하고, 순회 로직은 이터레이터 객체가 담당한다.
  • 일관된 접근
    • 서로 다른 데이터 구조(리스트, 트리, 집합 등)를 동일한 인터페이스로 순회할 수 있다.

구성요소

  • Iterator 인터페이스
    • 요소를 순회하기 위한 인터페이스를 정의
  • 주요 메서드:
    • has_next(): 다음 요소가 있는지 확인.
    • next(): 다음 요소를 반환.
  • Concrete Iterator
    • Iterator 인터페이스를 구현하고 컬렉션 내 요소를 실제로 순회
  • Aggregate 인터페이스
    • 컬렉션을 정의하는 인터페이스로, 이터레이터를 생성하는 메서드를 제공
  • Concrete Aggregate
    • Aggregate 인터페이스를 구현한 실제 컬렉션 클래스

예제

class CustomIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

# 컬렉션 클래스
class CustomCollection:
    def __init__(self, items):
        self.items = items

    def __iter__(self):
        return CustomIterator(self.items)

# 사용 예시
collection = CustomCollection(["apple", "banana", "cherry"])

for item in collection:
    print(item)
 

python 내장 이터레이터 사용

 
data = [1, 2, 3]
iterator = iter(data)

print(next(iterator))  # 1
print(next(iterator))  # 2
print(next(iterator))  # 3

이터레이터 패턴의 장점

  • 일관된 접근:
    • 서로 다른 컬렉션을 동일한 방식으로 순회.
  • 내부 구조 변경 용이:
    • 컬렉션 내부 구현을 변경해도 이터레이터를 통해 접근하는 코드는 영향을 받지 않음.
  • 다양한 순회 방식 지원:
    • 정방향, 역방향, 필터링 등 다양한 순회 방식을 구현 가능.

이터레이터의 단점

  • 오버헤드 증가:
    • 작은 크기의 단순한 컬렉션에 대해 이터레이터를 구현하면 불필요한 복잡도가 추가될 수 있음.

활용 사례

  • 데이터베이스 조회:
    • 결과 집합을 이터레이터로 반환하여 효율적으로 데이터 순회.
  • 파일 처리:
    • 한 줄씩 파일을 읽는 작업.
  • 프레임워크:
    • Django QuerySet이나 Pandas의 DataFrame 순회.