_ 개발

[DESIGN PATTERN/JAVA] Iterator - 이터레이터 패턴

옴뇽뇽 2024. 11. 10. 11:39

목 차

Iterator : 순서대로 지정해서 처리하기

Iterator 패턴의 구성 요소

Iterator 패턴의 특징

Iterator 패턴 구현 예시

 

Iterator : 순서대로 지정해서 처리하기

객체 내부 구조를 노출하지 않고도 그 안의 요소들을 순차적으로 접근할 수 있는 방법을 제공한다. 컬렉션(Collections) 객체가 가지고 있는 는 요소들에 순서대로 접근하여 처리를 반복한다. 

iterator 패턴을 설명하는 이미지

 

Iterator 패턴의 구성 요소

Iterator 패턴 다이어그램
Iterator 패턴 다이어그램

1. Iterator(반복자)

  • 요소에 순차적으로 접근하는 인터페이스를 정의. 주로 hasNext()와 next() 메서드가 포함됨

2. ConcreteIterator(구체적인 반복자)

  • Iterator 인터페이스를 실제로 구현하여 컬렉션 객체의 요소를 하나씩 접근하는 역할

3. Aggregate(집합체)

  • Iterator 객체를 생성하는 인터페이스를 정의

4. ConcreteAggregate(구체적인 집합체)

  • Aggregate 인터페이스를 구현하며, Iterator 인터페이스를 구현하는 구체적인 반복자를 반환하는 메서드를 갖고 있음

Iterator 패턴의 특징

컬렉션 변경 및 확장 용이성

  • Iterator 패턴을 사용하면, 컬렉션의 내부 구조와 상관 없이 요소들을 순회하여 접근할 수 있다.
  • hasNext(), next() 같은 일관된 메서드를 사용해, 컬렉션이 어떤 형태이든 동일 방식으로 접근 가능하다.
  • 컬렉션 추가나 변경에 관계 없이 인터페이스를 따르기만하면 되기 때문에 애플리케이션의 구조 변경이 용이하고, 유지보수가 간편해진다.

캡슐화 유지

  •  컬렉션의 내부에서 어떻게 처리가 이루어지는 알지 않고도 순회 작업을 처리하고, 또한 외부로 노출되지 않기 때문에 객체 지향 프로그래밍의 캡슐화 특성을 유지할 수 있다.

단일 책임 원칙

  • 컬렉션 객체는 데이터 관리에 집중하고 Iterator는 데이터를 순회하는 데 집중하기 때문에, 단일 책임 원칙을 지킬 수 있다.

 


Iterator 패턴의 구현 예시 : 책장(Bookshelf)와 책(Book)

1. Book 클래스

public class Book {
    private String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
  • 책의 제목을 저장하고 이를 반환하는 역할을 한다.

 

2. Bookshelf 클래스

import java.util.ArrayList;
import java.util.List;

public class Bookshelf {
    private List<Book> books;

    public Bookshelf() {
        this.books = new ArrayList<>();
    }

    public void addBook(Book book) {
        books.add(book);
    }

    public Book getBookAt(int index) {
        return books.get(index);
    }

    public int getLength() {
        return books.size();
    }

    public BookshelfIterator iterator() {
        return new BookshelfIterator(this);
    }
}
  • 책들을 저장하는 집합체로서, Iterator를 생성하는 메서드를 포함한다.

 

3. Iterator 인터페이스

public interface Iterator {
    boolean hasNext();
    Object next();
}
  • hasNext()와 next() 메서드를 가지고 다음 요소가 있는지 확인하고(hasNext), 다음 요소를 가져오는(Next) 역할을 한다.

 

4. BookshelfIterator 클래스

public class BookshelfIterator implements Iterator {
    private Bookshelf bookshelf;
    private int index;

    public BookshelfIterator(Bookshelf bookshelf) {
        this.bookshelf = bookshelf;
        this.index = 0;
    }

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

    @Override
    public Object next() {
        Book book = bookshelf.getBookAt(index);
        index++;
        return book;
    }
}
  • Iterator 인터페이스를 구현하여 Bookshelf 객체의 요소들을 하나씩 순차적으로 접근한다.

 

5. 클라이언트 코드

public class Main {
    public static void main(String[] args) {
        Bookshelf bookshelf = new Bookshelf();
        bookshelf.addBook(new Book("Java Programming"));
        bookshelf.addBook(new Book("Design Patterns"));
        bookshelf.addBook(new Book("Data Structures"));

        Iterator iterator = bookshelf.iterator();
        while (iterator.hasNext()) {
            Book book = (Book) iterator.next();
            System.out.println(book.getName());
        }
    }
}
  • Bookshelf 객체를 생성하고 책을 추가한 뒤, BookshelfIterator를 통해 책장을 순회하며 각 책의 제목을 출력한다.

 


Ref.