Iterator Pattern
1. 이터레이터 패턴(Iterator Pattern)이란?
간단하게 말하면 반복문
이다.
컬렉션 구현방법을 노출 시키지 않으면서도 그 집합체 안에 들어 있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해 준다.
아래는 java에서 패키지를 활용한 Iterator Interface를 사용하는 예시다.
import java.util.ArrayList;
import java.util.Iterator;
public class ShowDemo_Iterator {
public static void main(String[] args) {
ArrayList<String> number_list = new ArrayList<String>();
number_list.add("num_1");
number_list.add("num_2");
System.out.print("[Iterator Loop] ");
Iterator<String> iter = number_list.iterator();
while(iter.hasNext()){
System.out.print(iter.next() + " ");
}
}
}
▶︎ 출력
[Iterator Loop] num_1 num_2
오늘 과제는 이 Iterator Interface를 직접 구현해보는 것이다.
2. 이터레이터 패턴의 역할
1) UML
2) 역할
-
Aggregate(집합체)의 역할
Iterator역할을 만들어내는 인터페이스를 결정.
이 인터페이스는 ‘내가 가지고 있는 요소를 순서대로 검색해 주는 사람’을 만들어 내는 메소드. -
ConcreateAggregate(구체적인 집합체)의 역할
Aggregate역할이 결정한 인터페이스를 실제로 구현하는 일을 한다.
구체적인 Iterator 역할, 즉 ConcreateIterator역할의 인스턴스를 만들어 낸다. -
Iterator(반복자)의 역할
요소를 순서대로 검색해가는 인터페이스를 결정.
다음 요소가 존재하는지를 얻기위한 hasNext()와 다음 요소를 얻기 위한 next()를 결정. -
ConcreateIterator(구체적인 반복자)의 역할
Iterator가 결정한 인터페이스를 실제로 구현.
이 역할은 검색하기 위해 필요한 정보를 가지고 있어야 한다.
3. 문제
1) 문제
책을 책꽂이에 넣어 iterator interface를 구현하고자 한다.
2) UML
3) 역할
위 UML를 참조하여 아래 여섯 개의 클래스 및 인터페이스를 구현해보아라.
● Aggregate 인터페이스 - 집합체를 나타내는 인터페이스
● Iterator 인터페이스 - 하나씩 나열하면서 검색을 실행하는 인터페이스
● Book 클래스 - 책을 나타내는 클래스
● BookShelf 클래스 - 책꽂이를 나타내는 클래스
● BookShelfIterator 클래스 - 책꽂이를 검색하는 클래스
● Main 클래스 - 동작 테스트용 클래스
4) 해답
Aggregate.java
public interface Aggregate {
public abstract Iterator iterator();
}
Iterator.java
public interface Iterator{
public abstract boolean hasNext();
public abstract Object next();
}
Book.java
public class Book{
private String name;
public Book(String name){
this.name = name;
}
public String getName(){
return name;
}
}
BookShelf.java
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.java
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.java
public class Main {
public static void main(String[] args){
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("A"));
bookShelf.appendBook(new Book("B"));
bookShelf.appendBook(new Book("C"));
bookShelf.appendBook(new Book("D"));
Iterator it = bookShelf.iterator();
while(it.hasNext()){
Book book = (Book)it.next();
System.out.println(book.getName());
}
}
}
▶︎ 출력
A
B
C
D
댓글남기기