[디자인패턴] Iterator Pattern

Updated:

Categories:

Tags: ,

📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]

이터레이터 패턴(Iterator Pattern)

Iterator Pattern은 자료 구조 내부의 요소들을 순차적으로 접근할 수 있는 방법을 제공하는 디자인 패턴이다.
이 패턴은 서로 다른 자료 구조(예: 배열, 리스트, 맵 등)를 동일한 인터페이스로 탐색할 수 있도록 도와준다.
이를 통해 자료 구조 내부 구현 방식에 관계없이 동일한 방식으로 접근이 가능하다.

핵심 개념

  1. 컨테이너(Container)
    • 동일한 요소를 담고 있는 집합, 예를 들어 배열, 리스트, 맵 등이 컨테이너에 해당한다.
  2. 이터레이터(Iterator)
    • 컨테이너 내부의 요소를 순차적으로 접근하는 데 사용되는 객체.
    • 내부적으로 복잡한 탐색 로직이 있어도, 외부에서는 단순히 hasNext()next() 메서드만으로 순회 가능하다.

Iterator Pattern의 장점

  1. 일관된 인터페이스 제공
    • 서로 다른 자료 구조를 동일한 방식으로 순회할 수 있다.
  2. 캡슐화
    • 컨테이너의 내부 구조를 숨기고, Iterator를 통해서만 요소에 접근한다.
  3. 유연성
    • 자료 구조를 변경하더라도, Iterator 인터페이스를 유지하면 코드의 다른 부분에 영향을 주지 않는다.

Iterator Pattern 구조

Iterator Pattern은 일반적으로 다음 세 가지 요소로 구성된다.

  1. Iterator 인터페이스
    • hasNext(): 다음 요소가 있는지 확인.
    • next(): 다음 요소를 반환.
  2. Concrete Iterator(구체적인 Iterator)
    • Iterator 인터페이스를 구현하고, 실제 데이터 탐색 로직을 처리.
  3. Aggregate(컨테이너)
    • 자료 구조를 나타내며, Iterator 객체를 반환하는 createIterator() 메서드 제공.

자바로 구현: 커스텀 컬렉션 순회

아래는 Iterator Pattern을 활용해 커스텀 컬렉션을 순회하는 예제이다.

1. Iterator 인터페이스 정의

1
2
3
4
public interface Iterator<T> {
    boolean hasNext(); // 다음 요소가 있는지 확인
    T next(); // 다음 요소 반환
}

2. Concrete Iterator 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class CustomIterator<T> implements Iterator<T> {
    private final T[] items; // 순회할 데이터
    private int position = 0; // 현재 위치

    public CustomIterator(T[] items) {
        this.items = items;
    }

    @Override
    public boolean hasNext() {
        return position < items.length; // 배열 끝에 도달했는지 확인
    }

    @Override
    public T next() {
        if (!hasNext()) {
            throw new IllegalStateException("No more elements");
        }
        return items[position++]; // 현재 요소 반환 후, 포인터 이동
    }

3. Aggregate(컨테이너) 정의

1
2
3
4
5
6
7
8
9
10
11
public class CustomCollection<T> {
    private final T[] items;

    public CustomCollection(T[] items) {
        this.items = items;
    }

    public Iterator<T> createIterator() {
        return new CustomIterator<>(items); // 이터레이터 반환
    }
}

4. 클라이언트 코드

이터레이터를 사용하여 컨테이너 내부 데이터를 순회한다.

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
    public static void main(String[] args) {
        String[] data = {"A", "B", "C", "D"}; // 테스트 데이터
        CustomCollection<String> collection = new CustomCollection<>(data);

        Iterator<String> iterator = collection.createIterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next()); // A, B, C, D 출력
        }
    }
}

기존 자바 컬렉션과 Iterator

자바에서 Iterator Pattern은 이미 내장된 java.util.Iterator로 제공된다. 아래는 자바 컬렉션 프레임워크에서 Iterator를 사용하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");

        Iterator<String> iterator = list.iterator(); // 내장 Iterator 생성

        while (iterator.hasNext()) {
            System.out.println(iterator.next()); // Java, Python, C++ 출력
        }
    }
}

Iterator Pattern의 활용 사례

  1. 자바 컬렉션 프레임워크
    • ArrayList, HashSet, TreeMap 등에서 이터레이터를 통해 데이터 순회.
  2. 데이터베이스 커서(Cursor)
    • 데이터베이스의 결과 집합을 순차적으로 접근할 때 사용.
  3. 파일 시스템 순회
    • 디렉토리 내 파일 및 하위 디렉토리를 탐색할 때 활용.

Iterator Pattern은 자료구조 내부에 반드시 iterator속성이 존재하지 않더라도 적용 가능하다.

Iterator 인터페이스를 별도로 구현하면,기존 자료구조의 내부 구현 방식에 상관없이 통일된 방식으로 순회할 수 있다. Iterator Pattern의 강점은 자료구조와 상관없이 일관된 인터페이스를 제공하여 코드 재사용성과 확장성을 높이는 데 있다.

DesignPattern 카테고리 내 다른 글 보러가기

Leave a comment