본문 바로가기
JAVA

[ JAVA ] Iterator Pattern ( iterator 패턴 )

by 정윤재 2013. 2. 18.

iterator 패턴이란 for 문 대신 쓸 수 있는 반복문을 객체 지향에 맞게

 

디자인 패턴입니다. 보통 자바 코딩을 하면

 

while(iterator.hasNext()){

iterator.next();

}

 

요런 녀석들을 가끔 볼 수 있는데 이런 방식이 iterator 패턴 입니다.

 

일단 예제 UML 을 살펴 보면

 

 

입니다.

 

이것만 가지고는 복잡한 것 같지만 단순히 말하자면

 

BookShelf 클래스에스 Book 배열을 만들고 Book 배열에

 

Book 을 여러개 넣어 줍니다. 그리고 iterator 함수를 통해서

 

BookShelfIterator 를 return 받아서 while 문으로 반복문을

 

돌리는 방식 입니다.

 

이렇게 말로만 하면 더 미궁으로 빠지는 것 같은데

 

바로 예제 코드를 살펴 보겠습니다.

 

==================================================

//Aggregate interface

 

public interface Aggregate {
 public abstract Iterator iterator();
}

 

=================================================

//Iterator interface

 

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

 

=================================================

//BookShelf class

 

public class BookShelf implements Aggregate {
 
 private Book[] books;
 
 private int last = 0;
 
 public BookShelf(int maxsize){
  this.books = new Book[maxsize];
 }
 
 public Book getBookAt(int index){
  return books[index];
 }
 
 public void appendBook(Book book){
  this.books[last] =  book;
  last++;
 }
 public int getLength(){
  return last;
 }
 @Override
 public Iterator iterator() {
  // TODO Auto-generated method stub
  return new BookShelfIterator(this);
 }

}

 

=================================================

//BookShelfIterator class

public class BookShelfIterator implements Iterator{
 private BookShelf bookShelf;
 
 private int index;
 
 public BookShelfIterator(BookShelf bookShelf){
  this.bookShelf = bookShelf;
  this.index = 0;
 }
 
 public boolean hasNext(){
  if(index < bookShelf.getLength()){
   return true;
  }else{
   return false;
  }
 }
 public Object next(){
  
  Book book = bookShelf.getBookAt(index);
  index++;
  return book;
 }
} 

=================================================

 //Book class

public class Book {
 private String name;
 public Book(String name){
  this.name = name;
 }
 public String getName(){
  return name;
 }
}

 

=================================================

//Main class

 

public class Main {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  BookShelf bookShelf = new BookShelf(4);
  
  bookShelf.appendBook(new Book("Around the world in 80 Days"));
  bookShelf.appendBook(new Book("Bible"));
  bookShelf.appendBook(new Book("Cinderella"));
  bookShelf.appendBook(new Book("Daddy-Long-Legs"));
  
  Iterator it = bookShelf.iterator();
  
  while(it.hasNext()){
   Book book = (Book)it.next();
   
   System.out.println(book.getName());
  }
 }

}

 

와 같습니다.

 

이렇게 하면 실행 결과는

 

Around the world in 80 Days
Bible
Cinderella
Daddy-Long-Legs

 

와 같이 나옵니다.

 

그렇다면 그냥 for 문을 돌리면 될 것을 복잡하게 이런 패턴을 왜 쓰는가

 

하면 그냥 for 문을 쓰는 것 보다 iterator 를 쓰면 구현 부분에 독립적이

 

되기 때문입니다.

 

Book 배열에서 Vector 나 ArrayList 같은 Collection 으로 바꾼다 하더라도

 

  while(it.hasNext()){
   Book book = (Book)it.next();
   
   System.out.println(book.getName());
  }

 

부분은 전혀 변함 없이 독립적으로 가져 갈 수 있고

 

변경 되는 부분은 BookShelf  부분에서 배열을 Collection 으로 바꾸는 것

 

정도 일 겁니다. 중요 로직에서는 변경이 일어나지 않습니다.

 

 

* 위의 내용은 JAVA 언어로 배우는 디자인 패턴 입문 책을 정리한 내용입니다.


 


댓글