핵심 의도

컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법을 제공한다. 집합체를 사용하는 클라이언트는 집합체의 저장 방식을 몰라도 반복 작업을 할 수 있고, 집합체 역시 구체적인 저장방식을 공개하지 않아도 되므로 더 유연하고 다형적인 코드를 작성할 수 있다.

적용 상황

서로 다른 타입의 컬렉션에 대해 동일한 인터페이스로 모든 항목에 접근하고 싶을 때 사용한다. 예를 들어 배열이나 ArrayList를 가진 객체를 인터페이스로 한번 감싸서 동일한 인터페이스로 모든 항목에 접근할 수 있다.

자바에서 제공하는 Iterator 인터페이스를 사용하면 편리하다. 클라이언트 사용 객체가 자신이 가진 컬렉션에 해당하는 Iterator 구현체를 반환하는 메소드를 두면 된다. 배열은 Iterator 구현체가 따로 없으므로 만들어서 반환한다.

자바의 모든 컬렉션 유형은 Iterable 인터페이스를 구현한다. Iterable은 Iterator 인터페이스를 구현하는, 반복자를 리턴하는 iterator() 메소드가 들어있다.

솔루션의 구조와 각 요소의 역할

Untitled

객체에게 책임을 분할하기

클라이언트가 사용하려고 하는 컬렉션과 그 부가기능을 제공하는 책임은 ConcreteAggregate에게 있으며, 여러 종류의 객체가 존재할 수 있으므로 Aggregate 인터페이스로 접근한다. ConcreteAggregate가 가진 컬렉션의 모든 항목을 접근할 수 있게 하는 기능은 ConcreteIterator에게 있다. ConcreteAggregate가 다른 컬렉션을 가지고 있을 수 있으므로 Iterator도 인터페이스로 접근한다.

구현 포인트

자바에서 제공하는 Iterator 인터페이스는 hasNext(), next(), remove()를 구현하도록 하고 있다. 만약 remove() 구현이 필요하지 않다면 예외를 던져 처리한다.