[디자인패턴] Iterator Pattern - 순서대로지정해서 처리하기[디자인패턴] Iterator Pattern - 순서대로지정해서 처리하기

Posted at 2014. 5. 14. 17:51 | Posted in IT/디자인패턴
홈페이제작업체 NuGuWeb

Java 언어에서 배열 arr의 모든 요소를 표시하기 위해서는 다음과 같이 for문을 사용한다.

 for(int i=0;i<arr.length;i++){
      System.out.println(arr[i]);
}

 

변수 i는 처음에 0으로 초기화 되어 1씩 증가해 arr.length까지 루프를 돌게됩니다.

루프를 돌때 arr[i]의 내용은 표시되며 요소전체를 처음부터 차례대로 검색하게됩니다.

여기에서 사용되고 있는 변수 i의 기능을 추상화해 일반화 한것을 디자인 패턴에서는 Iterator 패턴이라고 합니다.

 

Iterator패턴이란?

무엇인가 많이 모여있는 것들은 순서대로 지정하면서 전체를 검색하는 처리를 실행하기 위한 것입니다.

 

 

Iterator패턴의 클래스 다이어 그램

 

 

Aggregate : 집합체를 나타내는 클래스

Iterator : 하나씩 나열해서 검색하는 인터페이스

Book : 책을 나타내는 클래스

BookShelf : 서가를 나타내는 클래스

BookShelfIterator : 서가를 검색하는 클래스

 

Iterator(반복자의 역할) - Iterator 인터페이스 : hasNext() , Next() -> 데이터를 순차적으로 접근하여 처리하기 위한 메서드 제공

구체적인 반복자의 역할 - BookShelfIterator 클래스

집합체의 역할 - Aggregate 인터페이스 -> 요소를 순서대로 검색해주는 반복자를 만들어내는 메소드를 제공

구체적인 집합체 - BookShelf 클래스  -> 데이터가 들어있는 클래스

 

 

Iterator 인터페이스

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

 

Book 클래스

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

 

BookShelf 클래스

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;
      }
      public Iterator iterator(){
             return new BookShelfIterator(this);
      }
}

 

BookShelfIterator 클래스

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;
        }
}

 

Main 클래스 (실행 클래스)

public class Main{
        public static void main(String[] args){
                BookShelf bookShelf = new BookShelf(4);
                bookShelf.appendBook(new Book("신데렐라"));
                bookShelf.appendBook(new Book("피노키오"));
                bookShelf.appendBook(new Book("피터팬"));
                bookShelf.appendBook(new Book("인어공주"));
                Iterator it = bookShelf.iterator();
                while(it.hasNext()){
                      Book book = (Book)it.next();
                      System.out.println(book.getName());
                }
        }
}

 

실행결과
신데렐라
피노키오
피터팬
인어공주

//