Iterator Pattern
Behavioral Pattern
Intro
필드에 대한 정보를 노출하지 않고 컬렉션의 요소를 탐색할 수 있는 패턴
패턴이 필요한 상황
컬렉션에 복잡한 데이터 구조가 있지만 클라이언트로부터 복잡성을 숨기려는 경우 Iterator 패턴을 사용한다.
패턴을 사용하여 순회 코드의 중복을 줄일 수 있다.
코드가 다른 데이터 구조를 탐색 할 수 있도록하거나 이러한 구조 유형을 미리 알 수 없는 경우 Iterator 를 사용한다.
구현 방법
Iterator 인터페이스를 선언
최소한 컬렉션에서 다음 요소를 가져 오는 메서드가 있어야 한다.
그러나 편의를 위해 이전 요소 가져오기, 현재 위치 추적 및 반복 종료 확인과 같은 몇 가지 다른 방법을 추가할 수 있다.
컬렉션 인터페이스를 선언하고 Iterator 를 가져오는 방법을 설명
반환 타입은 Iterator 인터페이스의 타입과 같아야 한다.
여러 개의 고유한 Iterator 그룹을 보유하려는 경우 유사한 메서드를 선언할 수 있다.
Iterator를 사용하여 순회할 수 있는 컬렉션에 대한 구체적인 Iterator 클래스를 구현한다.
Iterator 개체는 단일 컬렉션 인스턴스와 연결되어야 한다.
일반적으로 이 링크는 Iterator의 생성자를 통해 결정된다.
컬렉션 클래스에서 컬렉션 인터페이스를 구현한다.
주요 아이디어는 클라이언트에게 특정 컬렉션 클래스에 맞게 조정된 Iterator를 만드는 API를 제공하는 것이다.
컬렉션 객체는 그들 사이에 링크를 설정하기 위해 반복자의 생성자에 자신을 전달해야 한다.
클라이언트 코드를 검토하여 모든 컬렉션 순회 코드를 Iterator를 사용하여 교체한다.
클라이언트는 컬렉션 요소를 반복해야 할 때 새로운 Iterator 개체를 가져온다.
장점
SRP: 부치가 큰 순회 알고리즘을 별도의 클래스로 추출하여 클라이언트 코드와 컬렉션을 정리할 수 있다.
OCP: 새로운 유형의 컬렉션 및 Itrator를 구현하고 아무것도 중단하지 않고 기존 코드에 전달할 수 있다.
각 Iterator 객체에는 자체 반복 상태가 포함될 수 있으므로 동일한 컬렉션을 병렬로 반복할 수 있다.
단순 컬렉션에만 작동하는 경우 패턴이 과도한 작업이 될 수 있다.
Iterator를 사용하는 것은 일부 특수 컬렉션의 요소를 직접 살펴보는 것보다 덜 효율적일 수 있다.
Last updated