Javascript Map 클래스 정리

2020년 7월 20일 수정

≡ 목차 (Table of Contents)

Javascript에서는 사전형(Dictionary)과 비슷한 콜렉션 타입으로 기본형인 Object 타입을 그대로 이용하는 것이 일반적이긴 하지만, 필요에 의해 비슷한 용도의 Map이라는 특수한 자료구조 클래스를 사용할 수도 있다. 이 글은 이 Map 클래스를 가볍게 살펴보는 글이다.

Map

Map은 일반적으로 해시맵(Hash Map) 혹은 해시테이블(Hash Table)이라 부르는 자료구조를 구현한 클래스다. 여기서 해시란 고유 키 값을 구하는 해시 함수(Hash Function)을 이용한다는 의미에서 사용되는 이름이다.

즉 Map은 일반적으로 사전형(Dictionary Type)이라 불리는 키와 값을 1:1로 매칭시킨 데이터를 여러 개 담을 수 있는 복잡한 자료구조 타입이다.

사용법

평범하게 오브젝트를 생성한 다음에 .set() 메서드를 이용해 키의 값을 설정하거나 .get() 메서드를 이용해 키의 값을 읽을 수 있다. 그리고 .delete() 메서드를 이용해 키를 삭제할 수 있고, .has() 메서드를 통해 키가 있는지 파악할 수 있다.

let map = new Map();

map.set('key', 'vaule');

if (map.has('key')) {
  let v = map.get('key');
  ...
}

map.delete('key');

키는 문자열이 아니어도 된다.

map.set(1, 100);

다만 특정 오브젝트를 키로 사용하는 경우 실제로는 해당 오브젝트의 레퍼런스가 키로 사용된다는 점을 주의하자. 뭐 어떻게 보면 당연한 이야기다.

맵에 들어있는 키의 갯수를 알기 위해서 .size 를 이용할 수 있다.

console.log(map.size);

.keys() 메서드를 통해 모든 키의 리스트를 구할 수도 있고 .values() 메서드를 통해 모든 값 레스트도 구할 수 있다. 하지만 모든 키와 값을 루프로 액세스하고자 한다면 굳이 이것들을 구할 필요 없이 아래와 같은 식으로 for 루프를 이용할 수 있다.

for (let [k, v] of map) {
  console.log(`${k} = ${v}`);
}

특징

Map이 Object와 비교해서 가지는 가장 큰 특징은 순수 데이터 클래스라는 점이 있다. Object가 생성될 때 의도하지 않은 몇몇 키와 값들이 존재할 수 있는 것에 반해 Map은 매우 순수하게 넣지 않은 키는 존재하지 않는다.

물론 일반적인 상황에서 쓰기에 Map은 Object에 비해 약간 불편하다. 데이터 용도의 Object를 선언해서 바로 쓰는 것은 키를 문자열로 입력할 필요도 없고 따라서 코드 양도 줄고 아무래도 더 편할 수밖에 없다.

하지만 Map이 Object에 비해 유리한 점은 바로 퍼포먼스다. 특히 .size 프로퍼티를 구하는 속도는 Object에 비해 압도적으로 빠르다고 알려져있다.

루프를 통한 나열에서도 키와 값을 한 번에 받아오는 방법을 제공하기 때문에 키를 가져와서 각각 값을 읽어야하는 Object 방식에 비해 역시 퍼포먼스 잇점이 있을 수 있다. 참고로 나열되는 키의 순서도 입력한 순서를 그대로 보장한다는 특징도 있다.

그 외에 Object에 비해 키의 타입을 마음대로 선택할 수 있다는 점도 큰 특징일 것 같다.