[Design Pattern] Iterator Pattern

먹보·2023년 3월 8일
0

MUK_BO's Design Pattern

목록 보기
6/9

✍ Iterator Pattern의 정의

이터레이터를 사용하여 컬렉션의 요소들에 접근하는 디자인 패턴

이터레이터 패턴에 대해서 짚고 넘어가기 전 우선 이터레이터가 정확히 어떤 것인지를 알고 넘어가야 할 것 같다.

동일한 형태의 데이터 항목을 여러개 가지고 있는 것을 보통 Container 또는 Aggregator라고 하는데.

Aggregator의 예제로는 Array, Linked List, Tree, Graph 등이 있고 Aggregator의 종류마다 접근하는 방식이 다른데 이 때 사용하는 방식을 이터레이터라고 하며 그것을 사용해 어떠한 자료구조에도 상관 없이 요소들에 접근할 수 있게 만든 패턴을 이터레이터 패턴이라고 한다.

다음 코드를 보며 간략하게 파악해 보자

const mp = new Map();

mp.set('a',1)
mp.set('b',2)
mp.set('c',3)

const st = new Set();
st.add(1)
st.add(2)
st.add(3)

for (let a of mp) console.log(a)
for (let a of st) console.log(a)

위의 예제와 같이 mp와 st 모두 자료 구조에 상관 없이 for of 반복문을 통해 모든 요소에 접근이 가능하다.

또 다른 예제를 한 번 봐보자

const myIterator = {
  values: [1, 2, 3, 4, 5],
  currentIndex: 0,
  next: function() {
    return {
      value: this.values[this.currentIndex++],
      done: this.currentIndex > this.values.length
    }
  }
}

// Use the custom iterator object to iterate over the values array
const iterator = myIterator.next()
while (!iterator.done) {
  iterator = myIterator.next()
}

이건 내가 직접 만든 이터레이터 인데, 주어진 배열 values를 순회하면서 접근하는 로직이다.

✍ Where to Apply

  1. 컬렉션 순회 : 단순한 배열 또는 연결 리스트와 같은 객체를 순회할 때 쓰인다.

  2. Lazy Loading (LL) : LL 기술을 사용할 때도 사용 할 수 있는데, LL은 페이지를 읽어들이는 시점에 중요하지 않은 리소스 로딩을 추 후에 하는 기술 입니다. 대신에 이 중요하지 않은 리소스들은 필요할 때 로드가 되어야 합니다.

  3. 필터링 : 본래 주어진 객체를 변형시키지 않은 상태에서 요소들을 조건에 거를수가 있다.

  4. 비동기적 순회 : 웹 소켓에서 온 데이터 스트림 또는 DB 쿼리의 결과와 같은 비동기적 콜렉션을 순회하는데 사용 될 수도 있다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글