이전에 배운 자료구조는 다음과 같습니다.
위 자료구조만으로는 부족해서 새로운 자료구조가 등장했습니다.
맵(Map) 과 셋(Set) 에 대해 알아봅시다.
키 가 있는 데이터를 저장키 는 문자열만이 아니라 다른 자료형도 허용 (객체와의 차이점!)객체처럼 키를 이용하여 데이터를 저장하지만, 키에 다양한 자료형을 허용한다는 점이 객체와 구분됩니다.
맵은 객체를 키로 사용하는 것도 가능합니다.
맵은 일반적인 객체와 구분되므로 전용 메서드, 프로퍼티를 이용하여 데이터를 조작합니다.
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)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..offorEach위 메서드를 사용하여 반복 작업을 수행할 수 있습니다.
set.keys(): 값 모임을 이터러블 객체로 반환set.values(): 값 모임을 이터러블 객체로 반환set.entries(): [값, 값]을 한 쌍으로 하는 이터러블 객체를 반환키는 없지만 맵과의 호환성을 위해 위와 같은 메서드도 지원합니다.
위크맵, 위크셋은 자바스크립트의 가비지 컬렉터가 원활하게 동작하기 위한 수단입니다.
객체의 복사는 참조로 이루어지기 때문에, 원본 객체에 null 을 할당해도 이 객체를 참조하는 대상이 남아있다면 해당 객체는 가비지 컬렉터의 대상이 되지 않습니다.
따라서, 객체에 null 을 할당하면 이 객체를 참조하는 대상이 있더라도 객체가 가비지 컬렉션의 대상이 되도록 하는 방법이 필요했습니다.
이를 위해 위크맵과 위크셋을 사용합니다.
키 는 반드시 객체여야 함키 가 될 수 없음특징은 위와 같습니다.
위크맵
위크셋
지원하는 메서드는 위와 같습니다.
가비지 컬렉터의 동작 시점이 명확하지 않기 때문에 반복 작업 메서드나 size 등은 지원하지 않습니다.
순회를 위해 keys(), values(), entries() 메서드를 사용할 수 있는 자료구조는 다음과 같습니다.
객체의 경우, Object.keys, values, entries 를 사용합니다.
Object.keys(obj): 객체의 키만 담은 배열을 반환Object.values(obj): 객체의 값만 담은 배열을 반환Object.entries(obj): [키, 값] 쌍을 담은 배열을 반환맵 등에서 keys(), values(), entries() 메서드를 사용하면 이터러블 을 반환하는 것과 달리, 객체로 Object.keys, values, entries 연산을 하면 진짜 배열 을 반환합니다.