자바스크립트 맵과 셋

2018-02-22

map과 set은 ES6에서 새로 도입한 데이터 구조

ES6 이전에는 키와 값을 연결하려면 객체를 사용해야 했다. 하지만 객체를 이런 목적으로 사용하게 되면 여러 단점이 있다.

1. 객체 사용 단점

  • 프로토타입 체인 때문에 의도하지 않은 연결이 생긴다
  • 객체 안에 연결된 키와 값이 몇개나 되는지 쉽게 알아내기 힘들다
  • 키는 반드시 문자열이나 심볼이어야 하므로 객체를 키로 써서 값과 연결할 수 없다
  • 객체는 프로퍼티 순서를 보장하지 않는다.

2. 맵

  • keys()는 맵의 키를, values()는 맵의 값을, entries()는 첫번째 요소가 키이고 두번째 요소가 값인 배열을 반환
  • 이들 메서드가 반환하는 것은 모두 이터러블 객체이므로 for…of 루프를 쓸 수 있다.
  • 특정 요소를 삭제할 때는 map.delete(key)
  • 맵의 요소를 모두 지울 때는 map.clear()
  • map 예제


3. 위크맵

3-1. WeakMap 특징 (Map과의 차이점)

  • 키는 반드시 객체(Object)여야 한다. (원시 데이터형 허용 안됨. 가령 Symbol은 키가 될 수 없음.)
  • 키에 대한 참조가 손실되고, 값에 대한 참조가 더이상 없는 경우 garbage collecting이 일어난다.
  • 언제든지 오브젝트가 GC의 대상이 될 수 있기 때문에 WeakMap은 키들의 열거형을 지원하지 않는다.

3-2. GC와의 연관성

key로 사용하고 있던 오브젝트가 메모리에서 사라질 경우, 즉 GC에 의해서 가비지 컬렉팅이 일어나면 더이상 key로서의 역할을 수행하지 못한다. 메모리에서 사라진 key에 대해 삭제 작업이 필요한데, WeakMap을 사용하면 자동으로 해결해준다.

3-3. 제공 method

set(), get(), has(), delete() 이 네가지 메서드만 제공하고, 열거를 위한 메서드는 제거하지 않는다. clear() 역시 제공하지 않는다. 특정 시점의 수를 알기 어렵기 때문에 size 프로퍼티 또한 존재하지 않는다.


4. 셋

중복을 허용하지 않음

5. 위크셋

위크셋은 객체만 포함할 수 있으며, 이 객체들은 가비지 컬렉션의 대상이 된다.