맵과 셋

345·2023년 4월 30일

모던 JavaScript

목록 보기
12/23

이전에 배운 자료구조는 다음과 같습니다.

  • 객체: 키가 있는 컬렉션을 저장, 키는 문자열
  • 배열: 순서가 있는 컬렉션을 저장

위 자료구조만으로는 부족해서 새로운 자료구조가 등장했습니다.
맵(Map)셋(Set) 에 대해 알아봅시다.


🟢 맵(Map)

  • 가 있는 데이터를 저장
  • 는 문자열만이 아니라 다른 자료형도 허용 (객체와의 차이점!)

객체처럼 키를 이용하여 데이터를 저장하지만, 키에 다양한 자료형을 허용한다는 점이 객체와 구분됩니다.
맵은 객체를 키로 사용하는 것도 가능합니다.

메서드와 프로퍼티

맵은 일반적인 객체와 구분되므로 전용 메서드, 프로퍼티를 이용하여 데이터를 조작합니다.

  • new Map(): 맵 생성
  • map.set(key, value): key를 이용해 value를 저장
    • 호출시 맵 자신을 반환 (체이닝 가능)
  • map.get(key): key에 해당하는 값을 반환, key가 존재하지 않으면 undefined를 반환
  • map.has(key): key가 존재하면 true, 존재하지 않으면 false를 반환
  • map.delete(key): key에 해당하는 값을 삭제
  • map.clear(): 맵 안의 모든 요소를 제거
  • map.size: 요소의 개수를 반환

반복 작업

  • map.keys(): 키 모임을 이터러블 객체로 반환
  • map.values(): 값 모임을 이터러블 객체로 반환
  • map.entries(): [키, 값]을 한 쌍으로 하는 이터러블 객체를 반환
  • map.forEach: 배열과 유사하게 forEach 메서드 지원

객체 변환

  • Object.entries(obj): 객체의 키-값 쌍([key, value])을 요소로 가지는 배열 반환
    • new Map(Object.entries(obj));: 객체를 맵으로
  • Object.fromEntries: 맵의 [키, 값]을 요소로 가지는 이터러블을 반환
    • Object.fromEntries(map.entries()) 또는 Object.fromEntries(map)

🟡 셋(Set)

  • 중복을 허용하지 않는 컬렉션
  • 키 없이 값만 저장
  • Array.from() 으로 배열로 변환

셋은 중복 없이 값을 저장하는 자료구조입니다.
중복이 없다는 점 빼고는 구조가 배열과 같아 Array.from 메서드로 쉽게 배열화가 가능합니다.

메서드와 프로퍼티

  • new Set(iterable): 셋을 생성, 이터러블 객체의 값을 셋어 넣음
  • set.add(value): 값을 추가하고 셋 자신을 반환
  • set.delete(value): 값을 제거, 성공하면 true, 아니면 false를 반환
  • set.has(value): 셋 내에 값이 존재하면 true, 아니면 false를 반환
  • set.clear(): 셋을 비움
  • set.size: 셋에 몇 개의 값이 있는지 반환

셋은 중복을 허용하지 않으므로, 동일한 값은 아무리 add 해도 한 번만 셋에 들어갑니다.


반복 작업

  • for..of
  • forEach

위 메서드를 사용하여 반복 작업을 수행할 수 있습니다.

  • set.keys(): 값 모임을 이터러블 객체로 반환
  • set.values(): 값 모임을 이터러블 객체로 반환
  • set.entries(): [값, 값]을 한 쌍으로 하는 이터러블 객체를 반환

키는 없지만 맵과의 호환성을 위해 위와 같은 메서드도 지원합니다.


위크맵과 위크셋

위크맵, 위크셋은 자바스크립트의 가비지 컬렉터가 원활하게 동작하기 위한 수단입니다.
객체의 복사는 참조로 이루어지기 때문에, 원본 객체에 null 을 할당해도 이 객체를 참조하는 대상이 남아있다면 해당 객체는 가비지 컬렉터의 대상이 되지 않습니다.

따라서, 객체에 null 을 할당하면 이 객체를 참조하는 대상이 있더라도 객체가 가비지 컬렉션의 대상이 되도록 하는 방법이 필요했습니다.
이를 위해 위크맵과 위크셋을 사용합니다.


  • 위크맵
    • 는 반드시 객체여야 함
    • 원시값은 가 될 수 없음
  • 위크셋
    • 객체만 저장 가능

특징은 위와 같습니다.


  • 위크맵

    • get
    • set
    • delete
    • has
  • 위크셋

    • add
    • delete
    • has

지원하는 메서드는 위와 같습니다.
가비지 컬렉터의 동작 시점이 명확하지 않기 때문에 반복 작업 메서드나 size 등은 지원하지 않습니다.


Object.keys, values, entries

순회를 위해 keys(), values(), entries() 메서드를 사용할 수 있는 자료구조는 다음과 같습니다.

  • Map
  • Set
  • Array

객체의 경우, Object.keys, values, entries 를 사용합니다.

  • Object.keys(obj): 객체의 키만 담은 배열을 반환
  • Object.values(obj): 객체의 값만 담은 배열을 반환
  • Object.entries(obj): [키, 값] 쌍을 담은 배열을 반환

맵 등에서 keys(), values(), entries() 메서드를 사용하면 이터러블 을 반환하는 것과 달리, 객체로 Object.keys, values, entries 연산을 하면 진짜 배열 을 반환합니다.

profile
기록용 블로그 + 오류가 있을 수 있습니다🔥

0개의 댓글