JAVA

[JAVA] 이터레이터 패턴(Iterator Pattern)이 없어도 될 것 같은데.. 왜 사용할까?

sagecode 2025. 6. 10. 16:26

객체에 있는 자료구조를 접근할 때, 직접 객체에 접근하여 반복문을 사용하여 자료를 검색한다. 그럼 이터레이터 패턴을 사용해서 자료구조를 순회하는 이유는 무엇일까?

 

이터레이터 패턴(Iterator Pattern)이란?

이터레이터 패턴은 컬렉션의 내부 구조를 노출하지 않고, 그 안의 요소를 순차적으로 접근할 수 있게 해주는 디자인 패턴이다. 컬렉션이 어떤 방식으로 데이터를 담고 있든, 우리는 그 구조를 몰라도 next() 함수로 다음 데이터를 알아 낼 수 있다.

 

출처 : https://velog.io/@cham/Design-Pattern-%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%8C%A8%ED%84%B4-iterator-pattern

구현

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

// 이터레이터 인터페이스
interface Iterator {
    boolean hasNext();
    String next();
}

// 책장 클래스
class BookShelf implements Aggregate {
    private String[] books;
    private int size = 0;

    public BookShelf(int capacity) {
        books = new String[capacity];
    }

    public void addBook(String book) {
        books[size++] = book;
    }

    public String getBookAt(int index) {
        return books[index];
    }

    public int getLength() {
        return size;
    }

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

// 책장을 순회하는 이터레이터
class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index = 0;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
    }

    @Override
    public boolean hasNext() {
        return index < bookShelf.getLength();
    }

    @Override
    public String next() {
        return bookShelf.getBookAt(index++);
    }
}

// 사용 예시
public class Main {
    public static void main(String[] args) {
        BookShelf shelf = new BookShelf(5);
        shelf.addBook("Book1");
        shelf.addBook("Book2");
        shelf.addBook("Book3");

        Iterator it = shelf.createIterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

이렇게 이터레이터 패턴을 만들어 놓으면 다른 집합으로 확장시켜서 그 객체에서도 그 안의 집합의 구조를 모르더라도 next() 함수로 그 안에있는 요소들을 확인할 수 있다.

 

장점 설명
내부 구조를 몰라도 순회 가능 배열이든 리스트든 상관없이 next()로 순회 가능
일관된 인터페이스 제공 다양한 컬렉션이 동일한 방식으로 반복 처리 가능
SRP(단일 책임 원칙) 준수 컬렉션과 순회 로직을 분리해 관리할 수 있음
커스터마이징 용이 순서 반대 순회, 특정 조건 필터링 등도 구현 가능

 

어떤 문제 상황에서 잘 활용할 수 있을까?

보통 이터레이터 패턴은 동일한 순회를 반복해야 하는 상황이거나 여러가지 컬렉션이 합쳐져 있는 복잡한 객체의 내부 상황을 알지 않아도 될 때 사용하면 편리하다.

 

하지만 작은 프로젝트나 단순한 객체 구조같은 경우에는 오버엔지니어링으로 느껴질 수 있다.