행위(Behavioral) 패턴 - Iterator
2007/05/09 23:43
Iterator 는 디자인 패턴에서 가장 간단하고 가장 빈번하게 사용되는 패턴들 중의 하나. Iterator 패턴은 데이터의 내부적인 표현을 자세하게 아는 것 없이 표준적인 인터페이스를 이용한 데이터의 리스트나 컬렉션을 통하여 이동하는 것을 허용. 게다가 어떤 특별한 프로세싱과 데이터 컬렉션의 특정한 원소를 반환을 하는 특별한 Iterator를 정의할 수 있음.
1. 동기
Iterator는 어떻게 Iterator가 데이터를 이동시키는지를 드러내지 않고 데이터 원소들의 집합을 통하여 이동하는 정의된 Iterator는 인터페이스(interface)이기 때문에 반환되는 데이터를 위한 편리한 어떤 방법이든 구현
2. 고려해야 할 사항
컬렉션 또는 데이터 소스는 보통 클라이언트가 데이터를 조작할 수 있는 방법을 제공해야 함. 그러나, 컬렉션 또는 데이터 소스에 직접 데이터 조작 로직을 놓는 것은 항상 바람직하지 않음.
이 문제를 해결하기 위해 다음과 같은 사항에 유의.

4. 자바 프로그램언어에서의 사용 예
1. 동기
Iterator는 어떻게 Iterator가 데이터를 이동시키는지를 드러내지 않고 데이터 원소들의 집합을 통하여 이동하는 정의된 Iterator는 인터페이스(interface)이기 때문에 반환되는 데이터를 위한 편리한 어떤 방법이든 구현
2. 고려해야 할 사항
컬렉션 또는 데이터 소스는 보통 클라이언트가 데이터를 조작할 수 있는 방법을 제공해야 함. 그러나, 컬렉션 또는 데이터 소스에 직접 데이터 조작 로직을 놓는 것은 항상 바람직하지 않음.
이 문제를 해결하기 위해 다음과 같은 사항에 유의.
- 호출자가 컬렉션을 억세스하기 위한 로직을 직접 사용할 경우 불필요하게 작업이 복잡해지고 컬렉션에 강하게 결합되는 문제가 발생
- 컬렉션에 존재하는 데이터 요소들을 접근하는 것은 시간을 낭비하지 않으면서 쉬워야 함
- 다른 종류의 컬렉션들을 항상 같은 방법으로 접근할 수 있어야 함
3. 구조

4. 자바 프로그램언어에서의 사용 예

- J2SETM 플랫폼에서의 java.util 패키지에 존재하는 컬렉션에서 Iterator 패턴을 사용.
- Collection 인터페이스는 클라이언트가 Iterator 서브타입의 객체를 사용할수 있도록 iterator 메소드를 제공.
- List 인터페이스는 클라이언트가 ListIterator 서브타입의 객체를 사용할 수 있도록 listIterator 메소드를 정의. ListIterator 메소드는 Iterator 인터페이스보다 데이터 접근을 위한 좀더 많은 메소드를 정의.
- Iterator와 ListIterator 서브타입을 사용함으로써, 클라이언트는 일반적인 데이터 접근코드를 이용해 Collection 또는 List 서브타입을 액세스.
5. 결과
- 장점
억세스 관련 메소드를 정의하지 않음으로써 collection interface가 좀더 간단해짐
컬렉션 종류와 상관없이 동일한 방업을 컬렉션에 존재하는 요소들을 억세스할 수 있음
같은 컬렉션에 대해 다른 억세스 알고리즘을 지원
동시에 억세스 할 수 있도록 지원 - 단점
런타임에 오브젝트가 추가적으로 생성
쓰레드 환경에서 iterator를 통해 테이터를 억세스 하는 경우 다른 iterator가 접근할 수 없도록 설계해야 함
