본문 바로가기
개발공부 일지/면접

Iterator(이터레이터) 디자인 패턴

by Box Cat 2023. 10. 8.
728x90
반응형

이터레이터 패턴(Iterator 패턴)

- 여러 종류의 Collection을 하나의 Interface로 조회하는 패턴

- Iterator 패턴은 컬렉션(데이터 집합)을 탐색하거나 순회하는 방법을 추상화하는 패턴입니다.

- 반복문을 사용해서 개발자가 직접 인덱스를 통해 각각의 원소를 꺼내오는 대신, 자동으로 모든 원소를 차례대로 꺼내서 작업을 연속적으로 할 수 있게 해주는 행동 패턴(Behavioral Pattern)의 일종입니다. 반복로직을 구현과 분리가 가능하다는 장점이 있습니다.

 

 이 패턴은 컬렉션 내부 구현을 클라이언트 코드로부터 숨기고, 컬렉션의 요소를 반복적으로 열거하거나 접근하기 위한 일관된 인터페이스를 제공합니다. 이를 통해 클라이언트 코드는 컬렉션의 구조를 알 필요 없이 요소에 접근할 수 있습니다. 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있는 방법을 제공합니다.

  • iterator 패턴은 배열이나 Linked_List, Tree처럼 다른 데이터 구조를 갖는 Aggregator의 구성 항목을 표준화된 공통 API로 접근할 수 있습니다.
  • 데이터 구조가 다른 Aggregator일지라도 구성 항목을 표준화된 공통 API로 접근할 수 있음으로 하나의 공통된 알고리즘으로 처리할 수 있습니다.

Iterator패턴 구성요소

  • Iterator(반복자): 컬렉션 내부를 순회하며 요소에 접근하기 위한 인터페이스를 정의합니다. 
  • ConcreteIterator(구체적인 반복자): Iterator 인터페이스를 실제로 구현한 클래스로, 컬렉션 내의 요소를 순회하기 위한 로직을 포함합니다.
  • Aggregate(집합체): 동일한 데이터들의 집합으로, ConcreteIterator 객체를 반환하는 인터페이스를 제공합니다.
  • ConcreteAggregate: Aggregate 인터페이스를 구현한 실제 컬렉션 클래스로, ConcreteIterator를 생성하고 반환하는 메서드를 구현합니다.
 
 
 
 
export interface Iterator {
  next(): any;
  hasNext(): boolean;
}

export interface Aggregator {
  createIterator(): Iterator;
}

export class ConcreteIterator implements Iterator {
  private collection: any[] = [];
  private position: number = 0;

  constructor(collection: any[]) {
      this.collection = collection;
  }

  public next(): any {
      var result = this.collection[this.position];
      this.position += 1;
      return result;
  }

  public hasNext(): boolean {
      return this.position < this.collection.length;
  }
}

export class Numbers implements Aggregator {
  private collection: number[] = [];

  constructor(collection: number[]) {
      this.collection = collection;
  }
  public createIterator(): Iterator {
      return new ConcreteIterator(this.collection);
  }
}

function show() : void {
  var nArray = [1, 7, 21, 657, 3, 2, 765, 13, 65],
   numbers: Numbers = new Numbers(nArray),
   it: ConcreteIterator = <ConcreteIterator>numbers.createIterator();
 
  while (it.hasNext()) {
   console.log(it.next());
  }
 
 }
 show();
 
728x90
반응형

댓글