Behavioral Pattern
기본 표현(리스트, 스택, 트리 등)을 노출하지 않고 컬렉션의 요소를 순회할 수 있는 패턴
Collection은 주로 사용되는 데이터 타입 중 하나입니다. 대부분의 컬렉션은 간단한 list를 저장하지만 일부는 stack, tree, graph 등 복잡한 데이터 구조를 기반으로 합니다.
어떤 컬렉션으로 구성되든 각 요소에 접근하는 방법을 제공해야 합니다. list 기반의 컬렉션이라면 쉬운 작업이 되겠지만 트리와 같은 복잡한 데이터를 순차적으로 탐색하려면 어떻게 할 수 있을까요?
어떤 상황에는 트리의 깊이 우선 탐색
이 필요할 수도 있고, 다른 때에는 너비 우선 탐색
또는 임의 접근
이 필요할 수도 있습니다.
이렇게 많은 순회 알고리즘을 컬렉션에 추가하다 보면 데이터 저장이라는 본래의 책임이 흐려지게 됩니다. 또한 일부 알고리즘은 특정 앱마다 다를 수 있으므로 일반적인 컬렉션 클래스에 포함하는 것은 문제가 될 수 있습니다.
반면에 다양한 컬렉션과 함께 동작하는 클라이언트 코드는 요소를 정장하는 방법에는 신경 쓰지 않을 수 있습니다. 그러나 컬렉션은 모두 해당 요소에 엑세스하는 다양한 방법을 제공해야 하므로 특정 클래스에 연결하는 방법밖에 없습니다.
컬렉션의 순회 동작을 iterator라는 별도의 객체로 추출
알고리즘을 컬렉션 내부에서 구현하는 대신에 반복자 객체를 이용해 순회의 세부 사항은 캡슐화할 수 있습니다. 이런 방식으로 여러 반복자가 서로 독립적으로 존재하며 동일한 컬렉션을 거칠 수 있습니다.
일반적으로 반복자는 컬렉션 요소를 가져오는 기본 메서드를 제공합니다. 클라이언트는 아무 것도 반환하지 않을 때까지 즉 모든 요소를 순회할 때까지 이 메서드를 계속 실행할 수 있습니다.
모든 반복자는 동일한 인터페이스를 구현하여 클라이언트 코드가 모든 컬렉션 타입과 모든 순회 알고리즘을 사용할 수 있도록 합니다. 만약 컬렉션을 순회하는 특별한 방법이 필요한 경우 컬렉션이나 클라이언트를 변경할 필요 없이 새 반복자 클래스를 추가하면 됩니다.
로마에 여행을 간 당신은 주요 명소를 모두 방문할 계획입니다.
- 발이 닿는 곳으로 걷기
- 가이드 앱을 구비해 내비게이션으로 사용하기
- 가이드를 구하기
이런 모든 방법은 관광 명소 컬렉션에서 반복자 역할이 됩니다.
1. Iterator 인터페이스
2. Iterator 구현
3. Collection 인터페이스
4. Collection 구현
5. Client
참고 링크
iterator