logo

컬렉션과 제너레이터

Chapter 24

36 조회

0 추천

601 단어

4분 예상

2024. 08. 20. 게시

luasenvy 작성

CC BY-NC-SA 4.0

컬렉션

자료를 표현할 수 있는 객체 자료형의 하나로 Set, Map, WeakSet, WeakMap 등이 있다. Weak로 시작하는 자료형은 약한 참조를 사용하여 가비지 컬렉션을 통한 메모리 관리를 할 수 있다.

Set

const myset = new Set();

myset.add(1);
myset.add(1);
myset.add(2);
myset.add(3);
myset.add(4);

console.info(myset); // 1,2,3,4

Set은 배열과 비슷하지만 순서를 보장하진 않고 중복없이 데이터를 나열할 수 있다.

Map

const mymap = new Map();

mymap.set("1", 1);
mymap.set(1, 2);
mymap.set(() => {}, 3);
mymap.set({}, 4);

console.info(mymap);
// 0 : {"1" => 1}
// 1 : {1 => 2}
// 2 : {() => {} => 3}
// 3 : {Object => 4}
// size : 4

Map은 키-값 쌍으로 데이터를 저장할 수 있다. 언뜻보면 일반 객체와 차이가 없어 보이지만 크기를 확인할 수 있는 size 멤버를 제공한다. 기본적으로 반복 가능한 객체로 반복과 삽입 성능이 더 최적화 되어 있으며 순서를 보장한다. 또한 키를 객체, 함수, 숫자 등 다양한 자료형으로 설정할 수 있다.

제너레이터

어디서는 "발생기" 라고 굳이 번역하던데 북한도 아니고 그냥 제너레이터라고 하겠다.

JavaScript의 제너레이터는 함수 실행을 중단하고 다시 재개할 수 있는 특별한 함수다. function* 키워드를 사용해 정의하며 yield 문을 통해 중간 값을 반환한다. 제너레이터는 Iterable 객체를 반환하며 next() 메서드를 통해 실행을 제어할 수 있다. 일반 함수와는 다르게 한 번에 전체를 실행하지 않고 중단된 상태에서 필요한 부분만 실행할 수 있어 비동기 처리에 유용하다.

function* myGenerator() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = myGenerator();
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3

위 예시를 보면 next()를 호출 하기 전까지는 제너레이터가 실행을 멈추고 대기한다. next()를 호출하면 다시 실행되어 다음 yield를 만날때까지 실행하고 반환하고 다시 대기한다.

function* infinite() {
  let index = 0;

  while (true) {
    yield index++;
  }
}

이 특성을 응용하면 무한 루프처럼 정지할 걱정 없이 무한한 데이터 구조를 정의할 수도 있다.