Map
은 키-값 쌍을 저장하는 자료구조이다. 키와 값을 연결하여 데이터를 저장하고 조회할 수 있다. 각 키는 유일해야 하며, 순서가 보장된다.
Map
은 키가 있는 데이터를 저장한다는 점에서 객체와 유사하다. 다만, 다음의 차이점이 있다.
키의 다양한 데이터 타입
Map
은 키로 객체 뿐만 아니라 원시 데이터 타입(문자열, 숫자, 불리언 등)과 심지어 함수 등을 사용할 수 있다. 객체의 경우 객체의 내용이 아니라 참조를 기준으로 동등성이 판단되므로, 동일한 내용을 가진 다른 객체는 동등하지 않다.
키의 순서 보장
Map
은 요소들이 삽입된 순서를 기억하고 있다. 따라서 반복문을 사용하여 Map
의 키-값 쌍을 순차적으로 접근할 수 있다. 이는 객체의 프로퍼티 순서가 보장되지 않는 것과 대조적이다.
키의 중복 허용하지 않음
한 Map 객체 안에서는 같은 키를 여러 번 사용할 수 없다. 각 키는 유일해야 한다. 중복된 키를 사용하면 나중에 추가된 값이 덮어쓰게 된다.
메소드와 속성
Map 객체는 다음과 같은 주요 메소드와 속성을 제공한다.
Map
에는 다음과 같은 주요 메서드와 프로퍼티가 있다.
key
를 이용해 value
를 저장한다.key
에 해당하는 값을 반환한다. key
가 존재하지 않으면 undefined
를 반환한다.key
가 존재하면 true
, 존재하지 않으면 false
를 반환한다.key
에 해당하는 값을 삭제한다.// Map 생성
// ts에서 Map의 타입을 입힐 때는, 제너릭형태로 <> 안에 첫 번째는 key, 두 번째는 value의 타입을 넣어준다.
const myMap: Map<string | number | object, string | number> = new Map();
const obj = { key: 'object' };
// 키-값 쌍 추가
myMap.set('name', 'John');
myMap.set(1, 35);
myMap.set(obj, "this is object!");
// 값 조회
console.log(myMap.get("name")); // "John"
console.log(myMap.get(1)); // 35
console.log(myMap.get(obj)); // "this object!'
// 키 존재 여부 확인
console.log(myMap.has("name")); // true
// Map 크기 확인
console.log(myMap.size); // 3
대부분의 경우에는 Map의 키를 일관된 타입으로 사용하는 것이 더 명확하고 편리하다. 특히 객체와 같은 참조 타입을 키로 사용할 때, 객체의 동등성 비교에 주의해야 할 수 있다. 동일한 내용을 가지고 있더라도 서로 다른 객체는 동등하지 않게 될 수 있다.
Set
은 중복되지 않는 값을 저장하는 데이터 구조로, ES6(ECMAScript 2015)에서 도입되었다. Set
은 고유한 값들의 컬렉션을 관리할 때 사용되며, Map
과 달리 key
를 이용해 저장하지 않고, 오로지 value
만 저장된다.
주요 메서드는 다음과 같다.
Set
을 만든다. 이터러블 객체를 전달받으면(대개 배열을 전달받음) 그 안의 값을 복사해 셋에 넣어준다.Set
자신을 반환한다.true
, 아니면 false
를 반환한다.Set
내에 값이 존재하면 true
, 아니면 false
를 반환한다.const arr: Array<number> = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5];
const mySet: Set<number> = new Set(arr);
console.log([...mySet]); // spread 연산자를 통해 Set객체를 다시 배열로 만듬
mySet.add(6);
mySet.add(7);
mySet.add(5); // 중복된 값은 무시됨
console.log(mySet); // [1, 2, 3, 4, 5, 6, 7]
Set은 데이터 컬렉션에서 중복된 값을 피하고 싶거나, 고유한 값의 집합을 key없이 관리하고 싶을 때 사용한다. 각각 알맞는 상황에 Set과 Map을 구현하여 코딩하면 더욱 효율적인 코드를 작성할 수 있을 것이다.
map이랑 set에 대해 몰랐는데 알기 쉽게 깔끔하게 정리해주셔서 참고하고 갑니다 감사합니다~