본문 바로가기

Design Pattern/행위(Behavioral) 패턴

1. 반복자 패턴 ( Iterator Pattern )

목차

1. 반복자 패턴이란?

2. 반복자 패턴 구조

3. 예제


반복자 패턴 - Iterator pattern  이란?

 

 

배열 arr의 모든 요소를 표시하기 위해서는 아래와 같이 for 문을 사용하여 표시할 수 있습니다.

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

 

하지만 어떠한 이유로 arr가 아닌 vertor 나 map 을 사용해야한다면, 수정없이 해당 코드는 동작할 수 없습니다.

 

이러한 문제를 해결하기 위해 Iterator pattern 을 사용하게 됩니다.


반복자 패턴 구조

 

 

이름 내용
Aggregate 집합체를 나타내는 인터페이스
Iterator 하나씩 나열하면서 검색을 실행하는 인터페이스
Array 아이템을 담을 배열 클래스
ArrayIterator 배열에서 아이템을 검색하는 클래스
Item 아이템 클래스
Main 메인 클래스

 


예제

 

aggregate 인터페이스

 

Aggregate 인터페이스에 선언된 메서드는 iterator 메소드 하나 입니다.

이 메서드를 사용해서 Iterator 인터페이스를 구현한 클래스의 인스턴스를 1개 생성합니다.

public interface Aggregate {
    Iterator iterator();
}

 

 

Itertator 인터페이스

 

Iterator 인터페이스는 요소를 하나하나 검색하면서 for문 과 같은 역할을 수행합니다.

 

hasNext 메서드는 다음 값이 존재하는지 확인하는 메서드 입니다.

next 메서드는 hasNext 값이 true 일 경우 사용하는 메서드 입니다. 반환값이 Object 이므로 이 메서드는 집합체의 요소를 하나 반환합니다.

 

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

 

Array 클래스

 

Array 클래스는 집합체로 사용하기 위해 Aggregate 인터페이스를 구현하고 있습니다.

public class Array implements Aggregate {

    private Item[] items;

    public Array(Item[] items){
        this.items = items;
    }

    public Item getItem(int index){
        return items[index];
    }

    public int getCount(){
        return items.length;
    }

    @Override
    public Iterator iterator() {
        return new ArrayIterator(this);
    }

}

 

ArrayIterator 클래스

 

해당 클래스는 Iterator로 사용하기 위해 Iterator 인터페이스를 구현하고 있습니다.

Iterator의 hasNext 와 next 함수를 집합체의 요소에 맞게 구현하였습니다.

public class ArrayIterator implements Iterator{

    private Array array;
    private int index;

    public ArrayIterator(Array array) {
        this.array = array;
        this.index = -1;
    }

    @Override
    public boolean hasNext() {
        index++;
        return index < array.getCount();
    }

    @Override
    public Object next() {
        return array.getItem(index);
    }
}

 

 

Item 클래스

 

Item 클래스는 간단하게 name 필드만을 다루었습니다.

public class Item {

    private String name;


    public Item(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    @Override
    public String toString() {
        return name;
    }
}

 

 

 

main 클래스

 

Iterator pattern 이 잘 작동하고 있는지 확인해 보겠습니다.

 

먼저 아이템을 등록한 후 Iterator 를 생성하고 while 문을 통해 hasNext 로 값이 있으면 next 로 데이터를 가져와서

출력해보도록 하겠습니다.

public class MainIterator {

    public static void main(String[] args) {

        Item[] items = {
                new Item("item1"),
                new Item("item2"),
                new Item("item3"),
                new Item("item4")
        };

        Array array = new Array(items);
        Iterator iter = array.iterator();

        while (iter.hasNext()) {
            Item item = (Item) iter.next();
            System.out.println(item.getName());
        }

    }
}

 

실행 결과 

 

실행결과 등록한 아이템의 이름이 출력된것을 보실수 있습니다.