본문 바로가기

DesignPattern

Iterator Pattern

Design Pattern – Iterator Pattern

공부하는책  – Java 언어로 배우는 디자인 패턴 입문

 

ItratorUML.PNG

starUML로 하려니 인터페이스 모양이 이상해서 그냥 저렇게 했는데 점선이 잘못나왔음.

Iterator 패턴은 반복문의 일반적인 i의 기능을 추상화해서 일반화 한것이라고 생각하면됨.

iterator 의미자체가 ‘반복한다’,’반복자’의미를 가진다

UML은 서가(BookShelf)안에 책(Book)를 넣고 책의 이름을 차례대로 표시하는 예제

Aggregate는 집합체를 의미

Book클래스는 책이름을 받고 getName()으로 얻는것 뿐이기 때문에 생략…

<BookShelf.java>

package Itertator;

import java.util.ArrayList;

public class BookShelf implements Aggregate {

private ArrayList books;
private int last = 0;

public BookShelf(int init){
this.books = new ArrayList(init);

}

public Book getBookAt(int index) {
return (Book)books.get(index);
}
public void appendBook(Book book){
books.add(book);
}
public Iterator iterator() {
// TODO Auto-generated method stub
return new BookShelfIterator(this);
};

public int getLength(){
return books.size();
}
}

BookShelf클래스는 Aggregate 인터페이스를 구현한다. 한마디로  서가의  꽂을 사이즈를 받거나 몇번째 책인지 설정하는 클래스. books배열 필드를 가지고 BookShelf의 인스턴스를 만들때 maxsize를 지정하게 된다. books필드를 private으로 지정함으로써 외부 클래스로부터의 변경을 방지. 그리고 나서 BookShelfIterator라는 클래스의 인스턴스를 생성하여 그것을 반환. 하나씩 나열하고자 하는 처리는 iterator()메소드를 호출. 참고로 ArraList를 선언한 부분은 BookShelf의 사이즈를 초과해도 상관없게 하려고.. ㅋㅋ

 

<BookShelfIterator.java>

package Itertator;

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

@Override
public Object next() {
// TODO Auto-generated method stub
Book book = bookShelf.getBookAt(index);
index++;

return book;
}
}

BookShelfIterator클래스는 Iterator인터페이스의 hasNext()와 next()를 구현 . hasNext는 boolean으로 다음 검색할 책이있다면 true 검색할 책이 없다면 false를 리턴. next는 현재 Book인스턴스를 반환하고 다음으로 진행.

 

<Main.java>

 

public class Main {
public static void main (String[]args){
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”));
bookShelf.appendBook(new Book(“1”));
bookShelf.appendBook(new Book(“Daddy-Long-legs2”));
bookShelf.appendBook(new Book(“Daddy-Long-legs3”));

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
1
Daddy-Long-legs2
Daddy-Long-legs3

음.. Iterator 패턴은 반복처리하는 부분을 따로 분리해서 좀 더 캡슐화를 하기 위한 .. 정리가 안되네..

추상클래스나 인터페이스를 사용해서 얼추 감을 익혔다. 뭐 이렇게 쓰는구나 정도.. 책에서는 구체적인 클래스가 아니라 추상클래스나 인터페이스를 사용해야한다고 하지만 아직 감이 잘 없다. 결국엔 계속 해봐야 겠지

일단 결론은

Book의 집합체를 배열이 아닌 Vector를 사용하도록 수정해도 iterator메소드를 가지고 올바른 Iterator 인스턴스만 반환한다면, 반복을 처리하는 부분은 집합체에 의존하지 않고 잘 동작한다.

결국은 재이용화를 촉진한다는것!! 그렇게 되면 클래스를 부품처럼 큰 영향없이 조금의 수정만 으로 끝낼수 있다

좀 더 Iterator패턴을 사용한 예시를 보고싶다…


'DesignPattern' 카테고리의 다른 글

Clean Architecture 번역  (0) 2017.12.26
Singlton pattern  (0) 2016.05.18
template pattern  (0) 2016.05.18
Factory pattern  (0) 2016.05.18
Adapter Pattern  (0) 2016.05.18