[디자인패턴] 이터레이터 패턴, Iterator Pattern

sunny·2023년 3월 19일
0

디자인 패턴

목록 보기
7/11

이터레이터 패턴, Iterator Pattern


이터레이터 패턴이란? - 반복자 패턴

이터레이터(iterator)를 사용하여 컬렉션(collection)의 요소에 접근하는 디자인 패턴으로, 객체를 저장하는 방식은 보여주지 않으면서도 클라이언트가 객체들에게 일일이 접근할 수 있게 해주는 방법

  • 행위 패턴
  • 자료형의 구조와는 상관없이 이터레이터라는 하나의 인터페이스로 순회 가능

이터레이터 패턴의 구조

https://user-images.githubusercontent.com/88873302/226159820-860ef451-be82-449f-887b-760ce58f2bc2.png

  • Iterator 인터페이스 는 컬렉션 순회에 필요한 작업을 선언
  • Iterator의 구현체 (ArrayIterator) 는 컬렉션 순회를 위한 알고리즘 구현
    이때, Iterator 객체는 자체적으로 진행 중인 순회를 추적해야 한다
  • 컬렉션 인터페이스 (Aggregator) 는 컬렉션과 호환되는 반복자를 얻기 위해 하나 이상의 메소드를 선언
  • 컬렉션 인터페이스의 구현체 (Array) 는 클라이언트가 요청할 때마다 특정 구현체 클래스의 새로운 인스턴스를 반환
  • 클라이언트는 인터페이스를 통해 Iterator, 컬렉션을 사용할 수 있다.
    👉 이렇게 하면, 클라이언트가 구현 클래스와 결합되지 않으므로 동일한 클라이언트 코드로 다양한 반복자와 컬렉션을 사용할 수 있다

이터레이터 패턴의 적용 상황

  1. 컬렉션이 내부적으로 복잡한 데이터를 가지고 있지만 그 복잡성을 클라이언트로부터 숨기고 싶을 때
    • 반복자는 복잡한 데이터 작업에 대한 세부 정보를 캡슐화하여 클라이언트에 컬렉션 요소에 액세스하는 몇가지 간단한 방법을 제공한다. 이를 통해 클라이언트는 컬렉션의 복잡성을 알 수 없으므로 부주의하거나 악의적인 작업을 수행할 수 없다
  2. 앱 전체에서 순회 코드의 중복을 줄이고자 할 때
  3. 클라이언트 코드가 다른 데이터 구조를 순회하기를 원하거나 이러한 구조의 유형을 미리 알 수 없는 경우

이터레이터 패턴의 장단점

장점

  • 집합체 클래스의 응집도를 높여준다
  • 집합체 내에서 어떤 식으로 일이 처리되는지 알 필요 없이, 집합체 안에 들어있는 모든 항복에 접근할 수 있게 해준다
  • 모든 항목에 일일이 접근하는 작업을 컬렉션 객체가 아닌 이터레이터 객체에서 맡게 된다. 이렇게 하면, 집합체의 인터페이스 및 구현이 간단해질 뿐만 아니라, 집합체에서는 반복 작업에서 손을 떼고 원래 자신이 할 일에만 전념할 수 있다.

단점

  • 단순한 순회를 구현하는 경우 클래스만 많아져 복잡도가 증가한다

예제 코드

  • Aggregator.java
public interface Aggregator {
    Iterator iterator();
}
  • Iterator.java
public interface Iterator {
    boolean next();
    Object current();
    // next()
    // Iterator 인터페이스를 통해서 Aggregator의 다음 구성 데이터를 얻을 수 있도록 하고,
    // 얻을 수 있다면 true를 반환, 더 이상 얻을 수 없다면 false를 반환
    // current()
    // 구성 데이터를 하나 얻어 반환하는데, 이때 구성 데이터에 대한 타입은 정해지지 않아야 하므로 Object 타입으로 반환
}
  • Item.java
public class Item {
    private String name;
    private int cost;

    public Item(String name, int cost) {
        this.name = name;
        this.cost = cost;
    }

    @Override
    public String toString() {
        return "(" + name + ", " + cost + ")";
    }
}
  • Array.java
public class Array implements Aggregator {
    private Item[] items;

    public Array(Item[] items) {
        this.items = items;
    }

    public Item getItem(int index) {
        return items[index];
    }

    public int getCount() {
        return items.length;
    }

    @Override
    public Iterator iterator() {
        return new ArrayIterator(this);
    }
}
  • ArrayIterator.java
public class ArrayIterator implements Iterator{
    private Array array;
    private int index;

    public ArrayIterator(Array array) {
        this.array = array;
        this.index = -1;
    }

    @Override
    public boolean next() {
        index++;
        return index < array.getCount();
    }

    @Override
    public Object current() {
        return array.getItem(index);
    }
}
  • Demo.java
public static void main(String[] args) {
        Item[] items = {
                new Item("CPU", 1000),
                new Item("Keyboard", 2000),
                new Item("Mouse", 3000),
                new Item("HDD", 50)
        };

        Array array = new Array(items);
        Iterator it = array.iterator();

        while (it.next()) {
            Item item = (Item)it.current();
            System.out.println(item);
        }
    }
}

/*
(CPU, 1000)
(Keyboard, 2000)
(Mouse, 3000)
(HDD, 50)
 */
 

참고 자료

0개의 댓글

관련 채용 정보