이터레이터 패턴(Iterator Pattern)

2025. 3. 21. 14:29·Computer Science/Design Pattern

1. 이터레이터 패턴(Iterator Pattern)

- 컬렉션(Collection) 객체(=리스트, 배열 등)의 요소들에 순차적으로 접근할 수 있도록 인터페이스를 제공하는 디자인 패턴

- 컬렉션의 내부 구조를 노출 시키지 않고도 외부에서 그 요소들을 순차적으로 접근, 처리 가능


2. 이터레이터 패턴의 구성 요소

1. Iterator

  • Iterator 인터페이스는 컬렉션에서 요소를 순차적으로 접근할 수 있는 메서드를 제공
  • ex) hasNext(), next()

2. ConreteIterator

  • Iterator 인터페이스를 구현한 클래스
  • 컬렉션의 실제 요소들을 순차적으로 반환하는 역할

3. Aggregate( or Collection)

  • 이터레이터를 생성하는 역할
  • 컬렉션 자체는 이터레이터를 통해 접근할 수 있는 요소들을 보유하고 있음

4. ConcreteAggregate

  • Aggregate 인터페이스를 구현한 클래스
  • 이터레이터를 생성, 내부의 컬렉션 데이터를 제공

3. Java의 이터레이터 패턴 예제 코드

//Iterator 인터페이스
public interface Iterator{
    boolean hasNext();  //다음 요소가 있는지 확인하는 메서드
    Object next();      //다음 요소를 반환하는 메서드
    // >>> 반드시 구현해야 하는 메서드들임
}

// Iterator 인터페이스를 구현한 클래스
public class ConcreteIterator implements Iterator {
    private List<Object> collection;    // 순회할 컬렉션을 저장하는 변수
    private int index;                  // 현재 순회 중인 위치를 추적하는 변수

    public ConcreteIterator(List<Object> collection) { // 생성자
        this.collection = collection;
        this.index = 0;
        // >>> 컬렉션을 받아서 초기화 > index는 0으로 시작해서 순차적으로 반환
    }

    @Override
    public boolean hasNext() {  //다음 요소가 존재하는지 확인
        return index < collection.size(); // index가 컬렉션의 크기보다 작으면 true, 그렇지 않으면 false 반환
    }

    @Override
    public Object next() {
        if (hasNext()) {
            return collection.get(index++);  // 현재 index의 값을 반환하고, index를 증가
        }
        return null; // 더 이상 요소가 없으면 null 반환
    }
}

//컬렉션 객체가 이터레이터를 생성할 수 있도록 하는 인터페이스
public interface Aggregate {
    Iterator createIterator();  // 이터레이터 생성 > 실제 컬렉션에 대한 순차 접근을 제공할 이터레이터 객체 반환
}

//Aggregate 인터페이스를 구현한 클래스 > 컬렉션을 보유, 이터레이터 생성
public class ConcreteAggregate implements Aggregate {
    private List<Object> items; // 컬렉션을 저장하는 변수

    public ConcreteAggregate() {// 생성자
        items = new ArrayList<>(); // items 리스트를 초기화
    }

    public void addItem(Object item) {  // 컬렉션에 새로운 항목을 추가하는 메서드
        items.add(item);  // 컬렉션에 항목 추가
    }

    @Override
    public Iterator createIterator() {  // 이터레이터를 생성하는 메서드드
        return new ConcreteIterator(items);  // 이터레이터 생성 > 순차적 접근
    }
}

//클라이언트 코드 > 실제로 이터레이터 패턴을 사용하는 부분
public class Client {
    public static void main(String[] args) {
        ConcreteAggregate aggregate = new ConcreteAggregate();  // ConcreteAggregate 객체 생성 > 컬렉션 보유, 이터레이터 제공
        aggregate.addItem("Item 1");
        aggregate.addItem("Item 2");
        aggregate.addItem("Item 3"); // >>> 컬렉션에 항목 추가가

        Iterator iterator = aggregate.createIterator(); // aggregate에서 이터레이터를 생성 > 컬렉션 요소에 접근할 준비

        while (iterator.hasNext()) { // hasNext()가 true일 때만 iterator.next()를 호출
            System.out.println(iterator.next()); // 컬렉션의 요소를 순차적 출력
        }
    }
}

코드 분석

- 주석으로 대체


실행 흐름

1. 클라이언트는 ConcreteAggregate 객체를 생성하고, 여기에 항목을 추가

2. createIterator()를 호출해서 ConcreteIterator 객체를 생성 > 생성한 이터레이터를 사용하여 컬렉션 순차적 순회

3. 이터레이터는 hasNext()와 next() 메서드를 통해 컬렉션의 요소를 차례대로 출력


*** 헷갈린 부분

컬렉션의 내부 구조를 노출 시키지 않고도 외부에서 그 요소들을 순차적으로 접근, 처리 가능 > 외부에서 ???

> 컬렉션 객체는 내부에 여러 요소를 가지고 있지만, 외부에서는 그 요소들이 어떻게 저장되어 있는지 몰라도! Iterator를 통해서 순차적으로 요소들을 하나씩 접근하고 처리할 수 있다~ 라는 뜻


4. Collection ?

- 여러 개의 데이터 요소들을 하나의 집합으로 다루는 자료구조

- 같은 타입의 데이터를 그룹화, 이 데이터를 저장, 검색, 수정, 삭제하는 작업을 수행

- Java에서 데이터 구조를 처리하는 최상위 인터페이스

- Collection 인터페이스는 단일 객체의 그룹을 처리하는데 사용 > 데이터를 추가, 삭제, 순회할 수 있는 메서드 제공


5. Java에서의 Collection 주요 구성 요소

* FIFO(First In First Out): 먼저 들어온 데이터가 먼저 나가는 방식 > 가장 먼저 저장된 요소가 가장 먼저 처리 == Queue

  • List: 순서가 있는 데이터 집합, 인덱스를 사용하여 접근 > 중복 요소 허용
  • Set: 순서가 없는 데이터 집합 > 중복 요소 허용하지 않음
  • Queue: *FIFO(First In First Out) 방식으로 데이터를 처리하는 자료구조
  • Map: 키-값 쌍을 저장하는 자료구조, 키 = 유일 / 값 = 여러 번 저장 가능

6. 이터레이터 패턴의 장단점

장점

1. 컬렉션의 내부 구조를 외부에 노출하지 않고, 순차적 접근 가능 > 구현을 숨김

2. List, Set, Queue 등 여러 종류의 컬렉션을 동일한 방식으로 순차적 접근 > 다양한 순차 접근 방식 제공

3. 컬렉션을 변경하지 않고 순차적으로 접근만 가능 > 컬렉션에 대한 불변성 유지


단점

1. 순차 접근만 가능 > 임의 접근 불가 !!

2. 컬렉션을 순차적으로 접근 > 성능 문제 (성능에 민감한 대규모 데이터에서 사용하기엔 좀..)


7. 결론

이터레이터 패턴은 컬렉션의 내부 구조를 노출하지 않고, 다양한 컬렉션에 대해 순차적으로 접근할 수 있는 방법을 제공하는 디자인 패턴이다.

 

List, Set, Queue등 여러 컬렉션에 동일한 방식으로 접근 가능하다.
컬렉션(Collection)은 여러 개의 데이터 요소들을 하나의 집합으로 다루는 자료구조이다.
이터레이터 패턴의 단점은 순차적 접근만 가능하여 임의 접근이 불가능하고, 대규모 데이터에서는 성능 문제가 있을 수 있다.

'Computer Science > Design Pattern' 카테고리의 다른 글

MVC 패턴 (Model-View-Controller Pattern)  (0) 2025.03.24
노출모듈 패턴(Revealing Module Pattern)  (1) 2025.03.24
프록시 패턴(Proxy Pattern)  (0) 2025.03.19
옵저버 패턴(Observer Pattern)  (1) 2025.03.19
전략 패턴(Strategy Pattern)  (1) 2025.03.18
'Computer Science/Design Pattern' 카테고리의 다른 글
  • MVC 패턴 (Model-View-Controller Pattern)
  • 노출모듈 패턴(Revealing Module Pattern)
  • 프록시 패턴(Proxy Pattern)
  • 옵저버 패턴(Observer Pattern)
zajinmori
zajinmori
hello world !
  • zajinmori
    zajinmori's DevLog
    zajinmori
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 전체 (14)
      • Computer Science (14)
        • Design Pattern (8)
        • Programming Paradigm (3)
        • Network (3)
        • Operating System (0)
        • Database (0)
        • Data Structure (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • hELLO· Designed By정상우.v4.10.3
    zajinmori
    이터레이터 패턴(Iterator Pattern)
    상단으로

    티스토리툴바