이터레이터 패턴(Iterator Pattern)

Dear·2025년 10월 23일

TIL

목록 보기
72/74

💙 이터레이터 패턴

컬렉션(Collection)에 저장된 객체들(요소들)에 직접적인 내부 구조를 몰라도 순차적으로 접근할 수 있게 하는 디자인 패턴

컬렉션 내부 구조를 노출하지 않아도 된다.
List, Set, Map처럼 구조가 달라도 같은 방식(hasNext(), next())으로 순회할 수 있다.

💙 구성 요소

구성요소설명
Iterator (반복자)요소를 하나씩 꺼내는 역할 (next() 등)
Concrete Iterator실제 이터레이터 구현체
Aggregate (집합체)요소들의 모음 (컬렉션)
Concrete Aggregate실제 컬렉션 구현체 (리스트, 트리 등)

💙 동작 방식

  1. 집합체(Aggregate)는 자신의 내부 구조를 숨긴 채 이터레이터 객체를 생성하는 메소드(createIterator())를 제공한다.
  2. 이터레이터(Iterator)는 hasNext(), next() 등의 메소드로 컬렉션 내부의 각 요소를 순서대로 접근한다.
  3. 사용자는 이터레이터만 사용해서 모든 컬렉션의 모든 원소를 탐색한다.

// 1. Iterator 인터페이스
interface Iterator {
    boolean hasNext();
    Object next();
}

// 2. Aggregate (집합체) 인터페이스
interface Aggregate {
    Iterator createIterator();
}

// 3. ConcreteAggregate (구체적인 컬렉션)
class NameRepository implements Aggregate {
    private String[] names = {"Tom", "Jerry", "Mickey", "Donald"};

    @Override
    public Iterator createIterator() {
        return new NameIterator();
    }

    // 내부 이터레이터 클래스
    private class NameIterator implements Iterator {
        int index = 0;

        @Override
        public boolean hasNext() {
            return index < names.length;
        }

        @Override
        public Object next() {
            if (this.hasNext()) {
                return names[index++];
            }
            return null;
        }
    }
}

// 4. 클라이언트 코드
public class IteratorPatternDemo {
    public static void main(String[] args) {
        NameRepository repository = new NameRepository();
        Iterator iter = repository.createIterator();

        while (iter.hasNext()) {
            String name = (String) iter.next();
            System.out.println("Name: " + name);
        }
    }
}
profile
친애하는 개발자

0개의 댓글