본문 바로가기
컴퓨터과학/디자인패턴

[디자인패턴] 반복자 패턴 (Iterator Pattern)

by 윤호 2021. 10. 18.

목적

여러 요소들을 담고 있는 객체이 내부 구조에 대한 이해 없이

각 요소를 순서대로 접근하고 사용할 수 있도록 방법을 제공

요소

문제: 자료 구조 클래스의 요소를 한 개씩 접근하는 API가 서로 다름

해결: 반복자 객체를 중간에 넣음

결과: 변경 최소화

구현

  • iterator(): 반복자에 대한 참조를 반환 (Iterator 자료형)
  • hasNext(): 요소가 더 존재하는지 확인 (true / false)
  • next(): 다음 요소 가져오기. Object를 반환하므로 변환해서 사용
// Iterator 사용

Iterator iter = cities.iterator();

while (iter.hasNext()){
	String s = (String)iter.next();
	System.out.println(s);
}

for(Iterator iter = cities.iterator(); iter.hasNext();){
	String s = (String)iter.next();
	System.out.println(s);
}

 

임의의 aggregate IntDynamicArray의 iterator 구현

// 자료를 담는 클래스 Concrete Aggregate
public class IntDynamicArray implements Iterable {
	...
    public Iterator iterator() {
        return new IntDynamicArrayIterator(this);
    }
}
// IntDynamicArray의 Iterator 구현
public class IntDynamicArrayIterator implements Iterator {
    IntDynamicArray arr;
    int count;

    public IntDynamicArrayIterator(IntDynamicArray arr) {
        this.arr = arr;
        count = 0;
    }

    @Override
    public boolean hasNext() {
        return count < arr.size();
    }

    @Override
    public Object next() {
        Integer n = arr.get(count);
        count++;
        return n;
    }
}

댓글