면접을 보던 중 , JavaScript의 colletions에 관한 질문을 듣고 당황한 기억이 있다.
colletions이란 용어가 어떤 개념인지 몰라서 당황하여 해당 개념을 다시 정리해본다.
우선 Colletion이란 여러 원소들을 담을 수 있는 자료구조를 뜻한다.
JavaScript의 Colletion으로 ES5 이전에는 Object와 Array만 있었지만,
ES6 부터는 Map, WeakMap, Set, WeakSet, Typed Array가 추가되었다.
Map은 Key - value 의 쌍으로 이루어져있다.
객체와의 차이점
1. 객체와는 다르게 Key는 문자열이 아닌 다른 형태도 지정이 가능하다.
2. 객체는 크기를 수동으로 추적하지만 Map은 size메서드를 통해 쉽게 얻을 수 있다.
mdn 문서에 따르면 모든 Key & Value가 동일한 type인 경우에는 객체대신 Map사용을 추천하며,
각각의 요소마다 적용할 로직이 있는 경우에는 객체사용을 추천한다.
const map = new Map()
map.set("1",1)
map.set(2,2)
const map2 = new Map([["1",1],[2,2]])
Set은 쉽게 설명하면 중복값이 없는 배열이다.
const set = new Set()
set.add(1)
set.add("ggggg")
set.add(1)
set.size; // 2
Map과 Set을 구성하는 요소는 Map과 Set이 메모리에 존재한다면, 해당 요소는 가비지컬렉션으로 이동하지 않는다. 이러한 메모리 비효율성 때문에 WeakMap과 WeakSet이 등장하였다.
let test = {name:"test"}
const array = [test]
test = null;
//test를 null로 선언하여 가비지컬렉션으로 이동시키려고 했지만, array에 포함되어 있으므로 메모리에 남아있는다.
WeakMap은 Map과 달리 Key는 무조건 객체여아한다. 만약 Key로 참조하고 있는 객체가 없다면 메모리와 WeakMap에서 삭제된다.
let test = {name:"test"}
const map = new WeakMap()
map.set(test,"HI")
test = null;
WeakSet은 WeakMap과 유사하게 객체만 저장이 가능하다.