목차
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());
}
}
}
실행 결과
실행결과 등록한 아이템의 이름이 출력된것을 보실수 있습니다.
'Design Pattern > 행위(Behavioral) 패턴' 카테고리의 다른 글
7. 책임 연쇄 패턴 / Chain Of Responsibility Pattern (0) | 2023.11.02 |
---|