Iterator

1 minute read

Iterator Pattern

이터레이터 패턴

내부 표현부를 노출하지 않고 어떤 객체 집합에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공

UML
1

Aggregate

Iterator 객체를 생성하는 인터페이스 정의

ConcreteAggregate

해당 ConcreteIterator의 인스턴스를 반환하는 Iterator 생성 인터페이스 구현

Iterator

Iterator 객체를 생성하는 인터페이스 정의

ConcreteIterator

Iteraotr에 정의된 인터페이스를 구현, 검색에 필요한 정보 기억

예제

Iterator 객체를 생성하는 인터페이스. (Aggregate)

public interface Aggregate {
	public Iterator iterator();
}

Aggregate 인터페이스를 구상한 BookShelf (ConcreteAggregate)

책장이 필요한 기능들을 구현하며, 책들은 ArrayList로 관리한다. (Java는 이미 Iterator 객체를 제공하고 있으며, List는 이미 Iterator 패턴이 구현되어지만 본 예제에서는 없다고 가정)

public class BookShelf implements Aggregate {
	private List<String> _book = new ArrayList<>();
	
	public void addBook(String bookName) {
		_book.add(bookName);
	}
	
	public String getBookAt(int index) {
		return _book.get(index);
	}
	
	public int getBookCount() {
		return _book.size();
	}	
	
	@Override
	public Iterator iterator() {
		return new BookShelfIterator(this);
	}
}

Iterator가 제공하는 역할 인터페이스. (Iterator)

다음 요소 존재여부 및 다음 요소를 얻기 위한 메소드 정의

public interface Iterator {
    public boolean hasNext();
    public Object next();
}

Iterator를 구상하는 클래스 (ConcreteIterator)

BookShelf 객체를 갖고 있으며, BookShelf의 멤버(_book : String) 에 대한 반복을 제공하기 위해 Iterator인터페이스를 구현.

public class BookShelfIterator implements Iterator{
	private BookShelf _bookShelf; 
	private int _index;
	
    public BookShelfIterator(BookShelf bookShelf){
        _bookShelf=bookShelf;
        _index = 0;
    }
	@Override
	public boolean hasNext() {
		return (_index<_bookShelf.getBookCount()) ? true: false;
	}

	@Override
	public Object next() {
		String book = _bookShelf.getBookAt(_index++);
		return book;
	}

}

클라이언트

public class Client {
	public static void main(String[] args) {
		BookShelf bookShel = new BookShelf();
		bookShel.addBook("Gof의 디자인패턴");
		bookShel.addBook("헤드퍼스트 디자인패턴");
		bookShel.addBook("서버인프라를지탱하는기술");
		bookShel.addBook("테스트주도개발");
		
		Iterator bi = bookShel.iterator();
        while(bi.hasNext()){
            String book = bi.next().toString();
            System.out.println(book);
        }
	}
}

Iterator를 간단하게 구현한 예제이다. 실제 Java에서 제공하는 Iterator 객체는 좀더 강력한 기능을 갖고 있으니 참고


참고문헌

http://www.incodom.kr/%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0_%ED%8C%A8%ED%84%B4

GoF의 디자인 패턴

Categories: ,

Updated: