[Node.js] Map, Set, WeakMap, WeakSet

말하는 감자·2024년 3월 3일
0
post-thumbnail

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

섹션 1. 알아두어야 할 자바스크립트

📌 Map, Set, WeakMap, WeakSet

Map은 객체와 Set은 배열과 비슷하다.

자바스크립트는 하나의 기능에 대해 자유도가 너무 높다. 그래서 사람마다 무궁무진하게 활용하다보니 다른 사람의 코드를 볼 때 이 객체를 어떤 목적으로 썼는지 분석하기엔 헷갈리는 경우가 발생하여 Map은 객체와 Set처럼 전문적인 객체를 만들었다.

📍 Map

Map 특징

Map은 키와 값을 1:1로 매칭

const m = new Map(); // Map 생성
m.set('a', 'b'); // set(키, 값)으로 Map에 속성 추가
m.set('c', 'd');
m.get('a');

Map 객체 키

일반 객체는 키가 무조건 심볼(Symbol) 아니면 문자열(String)만 가능하지만 Map은 키와 값을 객체로 할 수 있다.

m.set({a: 'b'}, {c: 'd'});

m.get({a: 'b'});
// set한 객체와 get한 객체의 참조값이 다름
{ a: 'b'} != { a: 'b'} // true

Map에서 키를 객체로 사용하려면 변수에 미리 저장한 후 사용해야한다.
키를 객체로 쓸 수 있지만 같은 참조값을 가져야 같은 값이 나온다.

const obj = { key: 'key'}
m.set(obj, 123);
m.get(obj);

Map 길이

m.size

Map 반복문

반복문을 돌릴 때 주로 for in을 많이 사용했을 것이다.
이 때, 프로토타입에 있는 속성까지 나오버리므로 obj2.hasOwnProperty(i) 조건(보호장치)를 추가해주는 경우가 많았다.

const obj2 = {}

for (let i in obj2) {
  if(obj2.hasOwnProperty(i)) {
    obj2[i];
  }
}

위의 코드를 개선할 수 있도록 나온 게 Map이다.

for(const [k, v] of m) {
  console.log(k, v);
} // 속성간의 순서도 보장된다.

m.forEach((v, k) => { // 배열이 아니지만 forEach도 사용 가능하다.
  console.log(k, v);
});

Map 속성 제어

속성 존재여부 확인
has(키)로 속성 존재 여부를 확인한다.

m.has(obj);
m.has('z');

속성 삭제
delete(키)로 속성을 삭제한다.

m.delete(obj);

속성 전부 제거
clear()로 전부 제거

m.clear();

📍 Set

Set 특징

배열 대신 Set을 쓰는 걸 추천하나 Set은 배열을 완전히 대체하기 어렵다.
Set은 중복을 허용하지 않는다.
(데이터 타입이 다르면 허용된다. ex) 1, '1')

const s = new Set();
s.add(1);
s.add(1);
s.add(2);

Set 반복문

요즘에는 for in문보다 for of문을 많이 사용한다.

for (const a of s) {
  console.log(a);
}

s.forEach((a) => {
  console.log(a);
});

Set 요소 제어

요소 삭제
delete(요소)로 요소를 제거한다.

s.delete(2);

요소 전부 제거
clear()로 요소를 전부 제거한다.

s.clear();

Set을 이용한 배열 중복 제거

중복이 없어야하는 경우나 기존 배열에서 중복을 제거하고 싶을 때 사용하면 효율적이다.

const arr = [1, 2, 3, 2, 3, 5, 2]; // 2와 3 중복
const s2 = new Set(arr);

// Set이 아닌 배열(array)가 필요할 경우 형변환
Array.from(s2);

📍 WeakMap, WeakSet

가비지 컬렉팅이 된다. 메모리에서 빠르게 정리가 된다.

const wm = new WeakMap();
let obj3 = {};
wm.set(obj3, '123');

obj3 = null;
// wm에 있는 123도 함께 삭제된다.

🥔💬 ...?? 너 왜 살아있니??
아직 가비지컬렉팅이 안되어서 살아있나보다.


📑 출처

  • [개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지 (인프런/조현영)
profile
나는 말하는 감자다

0개의 댓글