> For the complete documentation index, see [llms.txt](https://seokrae.gitbook.io/sr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://seokrae.gitbook.io/sr/java-1/design/behavioural/_iterator.md).

# Iterator Pattern

Behavioral Pattern

## Intro

* 필드에 대한 정보를 노출하지 않고 컬렉션의 요소를 탐색할 수 있는 패턴

## 패턴이 필요한 상황

* 컬렉션에 복잡한 데이터 구조가 있지만 클라이언트로부터 복잡성을 숨기려는 경우 Iterator 패턴을 사용한다.
* 패턴을 사용하여 순회 코드의 중복을 줄일 수 있다.
* 코드가 다른 데이터 구조를 탐색 할 수 있도록하거나 이러한 구조 유형을 미리 알 수 없는 경우 Iterator 를 사용한다.

## 구현 방법

1. Iterator 인터페이스를 선언
   * 최소한 컬렉션에서 다음 요소를 가져 오는 메서드가 있어야 한다.
   * 그러나 편의를 위해 이전 요소 가져오기, 현재 위치 추적 및 반복 종료 확인과 같은 몇 가지 다른 방법을 추가할 수 있다.
2. 컬렉션 인터페이스를 선언하고 Iterator 를 가져오는 방법을 설명
   * 반환 타입은 Iterator 인터페이스의 타입과 같아야 한다.
   * 여러 개의 고유한 Iterator 그룹을 보유하려는 경우 유사한 메서드를 선언할 수 있다.
3. Iterator를 사용하여 순회할 수 있는 컬렉션에 대한 구체적인 Iterator 클래스를 구현한다.
   * Iterator 개체는 단일 컬렉션 인스턴스와 연결되어야 한다.
   * 일반적으로 이 링크는 Iterator의 생성자를 통해 결정된다.
4. 컬렉션 클래스에서 컬렉션 인터페이스를 구현한다.
   * 주요 아이디어는 클라이언트에게 특정 컬렉션 클래스에 맞게 조정된 Iterator를 만드는 API를 제공하는 것이다.
   * 컬렉션 객체는 그들 사이에 링크를 설정하기 위해 반복자의 생성자에 자신을 전달해야 한다.
5. 클라이언트 코드를 검토하여 모든 컬렉션 순회 코드를 Iterator를 사용하여 교체한다.
   * 클라이언트는 컬렉션 요소를 반복해야 할 때 새로운 Iterator 개체를 가져온다.

## 장점

* SRP: 부치가 큰 순회 알고리즘을 별도의 클래스로 추출하여 클라이언트 코드와 컬렉션을 정리할 수 있다.
* OCP: 새로운 유형의 컬렉션 및 Itrator를 구현하고 아무것도 중단하지 않고 기존 코드에 전달할 수 있다.
* 각 Iterator 객체에는 자체 반복 상태가 포함될 수 있으므로 동일한 컬렉션을 병렬로 반복할 수 있다.
* 단순 컬렉션에만 작동하는 경우 패턴이 과도한 작업이 될 수 있다.
* Iterator를 사용하는 것은 일부 특수 컬렉션의 요소를 직접 살펴보는 것보다 덜 효율적일 수 있다.
