티스토리 뷰

이터레이터 패턴(Iterator Pattern)

📝 한글로는 반복자 패턴이라고 부르는데 집합 객체(aggregate object)에 내부를 노출시키지 않고 원소들을 순차적으로 접근하는 방법을 제공하는 디자인 패턴이다.

 

객체 모델

 

⚙️ ConcreteAggregate
public class ConcreteAggregate<T> implements Aggregate<T>{
  Object[] aggregate;
  private int size;

  public ConcreteAggregate(Object[] aggregate) {
    this.aggregate = aggregate;
    this.size = aggregate.length;
  }
  @Override
  public Iterator<T> createIterator() {
    return new ConcreteIterator<T>(this.aggregate, size);
  }
}

 

⚙️ ConcreteIterator
public class ConcreteIterator<T> implements Iterator<T>{
  private int cursor;
  private int size;
  private Object[] aggregate;

  public ConcreteIterator(Object[] aggregate, int size) {
    this.cursor = 0;
    this.size = size;
    this.aggregate = aggregate;
  }

  @Override
  public T getNext() {
    return (T) aggregate[cursor++];
  }

  @Override
  public boolean hasNext() {
    return size > cursor;
  }
}
  • Cursor와 Size를 통해 다음 요소가 있는지 판단한다.
  • Cursor를 통해 현재 반복자가 제공해야 하는 요소를 판단한다.

 

🏃 Client
public class Client {
  public static void main(String[] args) {
    Object[] objectArray = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9 ,10).toArray();
    Aggregate<Integer> aggregate = new ConcreteAggregate<>(objectArray);
    Iterator<Integer> iterator = aggregate.createIterator();
    while (iterator.hasNext()) {
      Integer next = iterator.getNext();
      if (!iterator.hasNext()) {
        System.out.print(next);
        break;
      }
      System.out.print(next + " ,");
    }
  }
}

 

결과

 

 

⚠️ 추가 고려 사항

  • 순회 알고리즘이 집합 객체가 아닌 이터레이터에 있는 것이 집합 객체 외부에서 집합 객체의 원소를 접근한 것이기 때문에 캡슐화를 위반한 것으로 볼 수 있다. 때문에, 자바의 ArrayList 는 이터레이터의 구현체를 내부 클래스로 가지고 있는 것으로 추측된다.
  • 반복자가 순회하는 과정에 요소가 추가되었을 때에 대한 대책이 필요하다.

 

👍 장점

  • 다형성을 지닌 반복(Polymorphic iteration)이 가능하다.
    • 일관된 인터페이스로 여러 형태의 집합구조를 순회할 수 있다.
    • 자바에서 List, Set 등 다양한 컬렉션 객체에 내부를 순회하기 위해 Iterator라는 공통된 인터페이스를 제공하는 것을 예 로들 수 있다.
  • 집합 객체의 원소들을 손쉽게 접근할 수 있다.

 

𝌞 예제코드

 

GitHub - icraft2170/Blog-Example-Code

Contribute to icraft2170/Blog-Example-Code development by creating an account on GitHub.

github.com

 

😮 느낀 점

지금까지 Java에서 Iterator를 많이 사용해보지 않았다. 별로 필요성을 느끼지 못해서다.

하지만 반복자 패턴을 학습하면서 다형성을 지닌 반복이라는 키워드로 어느 상황에 필요한지 느낄 수 있었던 점이 좋았다.

참조

OpenJDK의 ArrayList 구현체(링크 아님)

코딩으로 학습하는 GoF의 디자인 패턴

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

GoF의 디자인 패턴

 

GoF의 디자인 패턴 :재사용성을 지닌 객체지향 소프트웨어의 핵심요소 - 교보문고

▶ 이 책은 디자인 패턴을 다룬 이론서입니다. 디자인 패턴의 기초적이고 전반적인 내용을 학습할 수 있습니다.

www.kyobobook.co.kr

댓글