이터레이터 패턴 (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 순회.
'디자인패턴' 카테고리의 다른 글
MVC 패턴 (Model-View-Controller Pattern) (1) | 2024.12.20 |
---|---|
노출 모듈 패턴 (Revealing Module Pattern) (0) | 2024.12.17 |
프록시패턴 (Proxy Pattern) (0) | 2024.12.15 |
옵저버 패턴 (Observer Pattern) (4) | 2024.12.14 |
디자인패턴 - 전략패턴 (2) | 2024.12.14 |