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 언어로 배우는 디자인 패턴 입문 책을 정리한 내용입니다.
'JAVA' 카테고리의 다른 글
[ JAVA ] 자주 쓰는 Collection API 정리 (0) | 2013.05.19 |
---|---|
[ JAVA ] System.getProperty("file.encoding") 변경 방법 (0) | 2013.03.12 |
[ JAVA ] Singletern Pattern ( 디자인 패턴 ) (0) | 2013.02.18 |
[ JAVA ] 일본어 파일 읽기 (0) | 2013.01.29 |
Illegal constant pool type 에러 (0) | 2013.01.18 |
댓글