[Javascript] Set과 Map

SungWoo·2024년 11월 11일

자바스크립트 공부

목록 보기
29/42
post-thumbnail

자바스크립트에서는 SetMap 이라는 컬렉션 객체를 제공한다. 이 두 객체는 일반 객체와는 다른 유용한 기능들을 제공하므로 이번 포스팅에서 정리하고 넘어가보자.

Set 객체

중복되지 않는 유일한 값들의 집합(set)

기본 배열과의 차이점

  • 중복 허용하지 않음: 동일한 값을 추가하면 무시된다.
  • 값의 순서 보장: 추가된 순서대로 요소가 저장된다.
  • 크기 확인: size 프로퍼티로 Set의 크기를 확인할 수 있다.

1. Set 객체의 생성

  • Set 객체는 생성자 함수로 생성한다.
  • Set 객체는 객체나 배열과 같이 자바스크립트의 모든 값을 요소로 저장할 수 있다.
const set = new Set();
console.log(set); // Set(0) {}
  • Set 생성자 함수는 이터러블을 인수로 전달받아 Set 객체를 생성한다.
  • 이때 이터러블의 중복된 값은 Set 객체에 요소로 저장되지 않는다.
// 중복을 허용하지 않는 Set 객체의 특성을 활용하여 배열에서 중복된 요소를 제거할 수 있다.
const set1 = new Set([1, 2, 3, 3]);
console.log(set1); // Set(3) {1, 2, 3}

const set2 = new Set('hello');
console.log(set2); // Set(4) {'h', 'e', 'l', 'o'}

2. 요소 개수 확인 (size)

  • Set 객체의 요소 개수를 확인할 때는 size 프로퍼티를 사용한다.
const set = new Set([1, 2, 3, 4, 4]);
console.log(set); // Set(4) {1, 2, 3, 4}

set.size = 10; // 무시된다.
console.log(set.size); // 4
  • size 프로퍼티는 setter 함수 없이 getter 함수만 존재하는 접근자 프로퍼티다.
  • 따라서 size 프로퍼티에 숫자를 할당하여 Set 객체의 요소 개수를 변경할 수 없다.

3. 주요 메서드

  1. add(value) : Set 객체에 요소를 추가한다. (이미 존재하는 값이라면 무시됨)
  2. has(value) : Set 객체에 특정 요소가 존재하는지 확인하여 존재 여부를 나타내는 불리언 값을 반환한다.
  3. delete(value) : Set 객체의 특정 요소를 삭제하고 성공 여부를 나타내는 불리언 값을 반환한다.
  4. clear() : Set 객체의 모든 요소를 일괄 삭제한다. 언제나 undefined를 반환한다.
const set = new Set([1, 2, 3, 4, 4]);
console.log(set); // Set(4) {1, 2, 3, 4}

set.add(5);
console.log(set.has(3)); // true
set.delete(1);
console.log(set); // Set(4) {2, 3, 4, 5}

4. 요소 순회

forEach

  • Set.prototype.forEach 메서드는 Array.prototype.forEach 메서드와 유사하게 콜백 함수와 forEach 메서드의 콜백함수에서 사용될 객체(옵션)을 인수로 전달한다.
    • 첫 번째 인수: 현재 순회 중인 요소값
    • 두 번째 인수: 현재 순회 중인 요소값
    • 세 번째 인수: 현재 순회 중인 Set 객체 자체
  • 첫 번째와 두 번째 인수는 같은 값이다.
  • Set 객체는 순서에 의미가 없어 인덱스를 가지지 않는다.
const set = new Set([1, 2, 3]);

// v2 자리에 key(index)가 와야하는데 set은 key가 없으므로 value를 다시 전달.
set.forEach((v, v2, set) => console.log(v, v2, set));
/*
1 1 Set(3) {1, 2, 3}
2 2 Set(3) {1, 2, 3}
3 3 Set(3) {1, 2, 3}
*/

for...of

  • Set 객체는 이터러블이므로 for...of문으로 순회할 수 있다.
  • 스프레드 문법과 배열 디스트럭처링의 대상이 될 수도 있다.
const set = new Set([1, 2, 3]);

for (const value of set) {
	console.log(value); // 1, 2, 3
}

console.log([...set]); // [1, 2, 3]

Map 객체

키와 값의 쌍으로 이루어진 컬렉션

일반 객체와의 차이점

  • 모든 자료형을 키로 사용 가능: 객체를 포함한 모든 값을 키로 사용 가능하다.
  • 이터러블: 입력된 순서대로 키를 저장한다.
  • 크기 확인: size 프로퍼티로 Map의 크기를 확인할 수 있다.

1. Map 객체의 생성

  • Map 객체는 생성자 함수로 생성한다.
  • 이터러블을 인수로 전달받아 Map 객체를 생성한다. 이때 인수로 전달되는 이터러블은 키와 값의 쌍으로 이루어진 요소로 구성되어야 한다.
const map = new Map();
console.log(map); // Map(0) {}

const map1 = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(map1); // Map(2) { "key1" => "value1", "key2" => "value2"}
  • 중복된 키를 갖는 요소가 존재하면 값이 덮어씌워진다. (중복된 키를 갖는 요소가 존재할 수 없다)
const map2 = new Map([['key1', 'value1'], ['key1', 'value2']]);
console.log(map2); // Map(1) { "key1" => "value2" }

2. 요소 개수 확인

  • size 프로퍼티를 통해 Map 객체의 요소 개수를 확인할 수 있다.
  • 이하 내용은 Set과 거의 동일하다.
const map = new Map([['key1', 'value1'], ['key2', 'value2']]);

map.size = 10; // 무시된다.
console.log(map.size); // 2

3. 주요 메서드

  • set(key, value) : keyvalue를 설정한다.
  • get(key) : key에 해당하는 값을 반환한다. key가 없으면 undefined를 반환한다.
  • has(key) : 특정 키의 존재 여부를 확인하여 불리언 값을 반환한다.
  • delete(key) : 특정 키를 삭제하고 성공 여부를 나타내는 불리언 값을 반환한다.
  • clear() : 모든 키-값 쌍을 제거한다.
const map = new Map();

map.set('name', 'Sean');
map.set('age', 25);
map.set(true, 'boolean key');
console.log(map.get('name')); // Sean
console.log(map.size); // 3

map.forEach((value, key) => {
  console.log(`${key}: ${value}`);
});
// name: Sean
// age: 25
// true: boolean key

4. 요소 순회

  • Set과 같이 이터러블이며 forEachfor...of문을 사용하여 요소를 순회한다.
  • keys(), values(), entries() 메서드를 사용하여 요소키를 값으로 갖는 이터레이터를 반환할 수 있다.

Set, Map 요약

profile
어제보다 더 나은

0개의 댓글