이터레이터 패턴이란, 어떤 컬렉션 타입이더라도 순회할 수 있도록 해주는 패턴을 말한다.
예를 들어 같은 객체를 담고 있는 컬렉션 객체가 2개 있는데, 이 중 하나는 배열에 담고있고, 하나는 ArrayList에 담고있다고 해보자.
두 객체의 값을 합쳐야 하는 경우에는, 각각 ArrayList와 배열을 가져와서 다른 방법으로 순회해주어야 한다.
이러한 경우에, Iterator라는 인터페이스를 아래와 같이 만들고, 각 객체에서 구현해준다면 같은 방식으로 순회가 가능해지게 된다.
classDiagram
class Iterator{
hasNext()
next()
<<Interface>>
}
Iterator 인터페이스를 간단히 소개하자면, hasNext() 메서드는 현재 순회자 이후에 값이 있는지를 확인하는 기능이고, next()는 다음 값을 반환해주는 메서드이다.
실제로 사용할 때에는 다음과 같이 사용하게 된다.
while (iterator.hasNext()) {
Item item = iterator.next();
}
결과적으로 Iterator 패턴은, 컬렉션 구현 방법을 노출시키지 않으면서도 그 컬렉션 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해준다.
first() 함수가 없을까?
자바 5부터는 for/in 이라는 새로운 for 선언문이 추가되었다.
이 선언문을 사용하면, 별도의 Iterator 객체를 만들지 않아도 컬렉션이나 배열에 대해서 순환문을 돌릴 수 있게 된다.
for (Object obj: collection) {
...
}
컴포지트 패턴은 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다.