이터레이터 패턴의 소개와 활용 예시

#이터레이터패턴 #자바

이터레이터 패턴은 객체의 집합을 순회하고 접근할 수 있는 방법을 제공하는 디자인 패턴입니다. 주로 컬렉션 내부의 요소를 순차적으로 접근하는데 사용됩니다. 이를 통해 클라이언트는 컬렉션의 내부 구조를 알지 않아도 원하는 요소에 접근할 수 있습니다.

이터레이터 패턴의 구조

이터레이터 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:

  1. Iterator(반복자): 순회하며 요소에 접근하는 인터페이스를 정의합니다.
  2. Concrete Iterator(구체적인 반복자): 실제로 순회하면서 요소에 접근하는 구체적인 구현체입니다.
  3. Aggregate(집합체): 객체들을 가지고 있는 컬렉션을 나타내는 인터페이스를 정의합니다.
  4. Concrete Aggregate(구체적인 집합체): 실제로 객체들을 저장하고 있는 컬렉션의 구현체입니다.

이터레이터 패턴의 활용 예시

자바에서의 이터레이터 패턴을 살펴보겠습니다.

import java.util.Iterator;
import java.util.List;

// Aggregate 인터페이스
interface Aggregate {
    Iterator<String> iterator();
}

// Concrete Aggregate 구현체
class MyList implements Aggregate {
    private List<String> list;

    public MyList(List<String> list) {
        this.list = list;
    }

    // Iterator 반환
    public Iterator<String> iterator() {
        return list.iterator();
    }
}

// Iterator 인터페이스
interface Iterator<E> {
    boolean hasNext();
    E next();
}

// Concrete Iterator 구현체
class MyIterator<E> implements Iterator<E> {
    private List<E> list;
    private int cursor;

    public MyIterator(List<E> list) {
        this.list = list;
        this.cursor = 0;
    }

    // 다음 요소가 있는지 확인
    public boolean hasNext() {
        return cursor < list.size();
    }

    // 다음 요소 반환
    public E next() {
        E element = list.get(cursor);
        cursor++;
        return element;
    }
}

// 사용 예시
public class Main {
    public static void main(String[] args) {
        List<String> myList = List.of("Apple", "Banana", "Cherry");
        Aggregate aggregate = new MyList(myList);
        Iterator<String> iterator = aggregate.iterator();

        while (iterator.hasNext()) {
            String fruit = iterator.next();
            System.out.println(fruit);
        }
    }
}

위 예시 코드에서는 MyList 클래스가 Aggregate 인터페이스를 구현하고, MyIterator 클래스가 Iterator 인터페이스를 구현하고 있습니다. MyList 클래스는 List 객체를 가지고 있으며, iterator() 메서드를 통해 MyIterator 객체를 반환합니다.

Iterator 인터페이스의 hasNext() 메서드는 다음 요소가 있는지 확인하고, next() 메서드는 다음 요소를 반환합니다. 이를 이용하여 MyList에서 Iterator를 통해 컬렉션의 요소에 접근할 수 있습니다.

위 예시에서는 myList를 순회하면서 “Apple”, “Banana”, “Cherry”를 출력합니다.

이터레이터 패턴은 객체를 순회하고 접근하는 일관된 방법을 제공하므로 코드의 가독성과 재사용성을 높일 수 있습니다. 특히 컬렉션 내부 구조를 알지 못할 때 유용하게 활용될 수 있습니다.