이터레이터 패턴

Trace·2024년 8월 7일

Design-Pattern

목록 보기
5/7

이터레이터 패턴이란

이터레이터패턴은 이터레이터 (iterator)를 사용하여 컨터에너의 요소들에 접근하는 디자인 패턴
각기 다른 자료구조들을 똑같은 인터페이스로 순회를 쉽게 할 수 있다는 장점이 있다.
컨터이너란 동일한 요소들을 담아놓는 집합
배열, 맵(key : value) 등이 있음

이터레이터 패턴 장점

이터레이터 패턴(Iterator Pattern)은 컬렉션(예: 배열, 리스트) 내부의 요소들에 접근하는 방법을 제공하는 디자인 패턴
이 패턴을 사용하면 컬렉션의 내부 구조를 노출하지 않고도 요소들을 순차적으로 접근할 가능
주로 데이터 구조를 순회할 때 유용하며, 컬렉션 내의 각 요소에 대해 동일한 작업을 수행할 수 있게 해줌

예를들면 array 같은 경우 index를 통해서 0번째, 1번째… 이런 식으로 찾을 수 있는데

map 같은 경우 key : value 형식으로 되어있어 value를 찾기 위해서는 모든 key값을 탐색해야 하는 불편함이 있음

그런 경우 이터레이터를 통해 쉽게 탐색이 가능 함

이터레이터 패턴의 주요 구성 요소

  1. 이터레이터(Iterator): 요소들을 순회하는 데 필요한 인터페이스를 정의
    주로 hasNext(), next(), remove()와 같은 메서드를 포함
  2. 콘크리트 이터레이터(Concrete Iterator): 이터레이터 인터페이스를 실제로 구현하여 컬렉션 요소를 순회하는 구체적인 방법을 제공
  3. 컬렉션(Collection): 이터레이터 객체를 반환하는 인터페이스를 정의
    일반적으로 createIterator()와 같은 메서드를 포함
  4. 콘크리트 컬렉션(Concrete Collection): 컬렉션 인터페이스를 구현하여 이터레이터 객체를 생성하는 구체적인 방법을 제공

이터레이터 패턴의 장점

  • 컬렉션 구조를 노출하지 않음: 이터레이터 패턴을 사용하면 컬렉션의 내부 구조를 외부에 노출하지 않고 요소를 순회할 수 있음
  • 일관된 인터페이스 제공: 서로 다른 종류의 컬렉션에 대해 일관된 인터페이스를 제공하여 코드를 단순화할 수 있음
  • 유연성: 컬렉션의 요소에 접근하는 방법을 쉽게 변경할 수 있음

이터레이터 패턴 예제 (JavaScript)

이터레이터 인터페이스

이터레이터 패턴의 핵심은 next() 메서드를 가진 객체입니다. 이 객체는 donevalue 속성을 가진 객체를 반환함
done은 이터레이션이 끝났는지를 나타내고, value는 현재 값을 나타냄

예제 코드

javascript코드 복사
// 컬렉션 클래스
class ConcreteCollection {
  constructor() {
    this.items = [];
  }

  addItem(item) {
    this.items.push(item);
  }

  createIterator() {
    return new ConcreteIterator(this.items);
  }
}

// 이터레이터 클래스
class ConcreteIterator {
  constructor(collection) {
    this.collection = collection;
    this.position = 0;
  }

  next() {
    if (this.position < this.collection.length) {
      return { value: this.collection[this.position++], done: false };
    } else {
      return { done: true };
    }
  }
}

// 사용 예시
const collection = new ConcreteCollection();
collection.addItem("Item 1");
collection.addItem("Item 2");
collection.addItem("Item 3");

const iterator = collection.createIterator();
let result = iterator.next();
while (!result.done) {
  console.log(result.value);
  result = iterator.next();
}
profile
개발하는사람

0개의 댓글