Iterator Pattern

2 분 소요

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

iteratorUML

2) 역할

  • Aggregate(집합체)의 역할
    Iterator역할을 만들어내는 인터페이스를 결정.
    이 인터페이스는 ‘내가 가지고 있는 요소를 순서대로 검색해 주는 사람’을 만들어 내는 메소드.

  • ConcreateAggregate(구체적인 집합체)의 역할
    Aggregate역할이 결정한 인터페이스를 실제로 구현하는 일을 한다.
    구체적인 Iterator 역할, 즉 ConcreateIterator역할의 인스턴스를 만들어 낸다.

  • Iterator(반복자)의 역할
    요소를 순서대로 검색해가는 인터페이스를 결정.
    다음 요소가 존재하는지를 얻기위한 hasNext()와 다음 요소를 얻기 위한 next()를 결정.

  • ConcreateIterator(구체적인 반복자)의 역할
    Iterator가 결정한 인터페이스를 실제로 구현.
    이 역할은 검색하기 위해 필요한 정보를 가지고 있어야 한다.


3. 문제

1) 문제

책을 책꽂이에 넣어 iterator interface를 구현하고자 한다.

2) UML

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

# 참조 사이트

댓글남기기