Studying/JavaScript

Set 객체

SEOHEY 2021. 10. 26. 20:26

ECMA Script 2015(ES6)에 추가된 Set 객체는 자료형에 관계없이 원시값과 객체 참조 모두 유일한 값을 저장하는 자료구조이다.

수학에서 다루는 집합과 동일한 개념이라고 볼 수 있다.

 

Set 객체는 new 연산자와 함께 Set 생성자함수를 호출하여 생성할 수 있다.

const set = new Set();

console.log(set); // Set(0) {}

생성자함수를 호출할 때 인수로 이터러블을 전달하면 해당 이터러블의 중복된 요소를 제거한 Set 객체가 생성된다.

const set = new Set([3, 4, 4, 5]);

console.log(set); // Set(3) { 3, 4, 5 }

Set.prototype.add 메서드를 이용하여 Set 객체에 요소를 추가할 수 있다. 이때 중복되는 요소는 추가되지 않고, Set 객체가 현재 요소로 가지지 않는 값만 추가된다.

const set = new Set([2, 3, 4]);

set.add(1);

console.log(set); // Set(4) { 2, 3, 4, 1 }

set.add(2);

console.log(set); // Set(4) { 2, 3, 4, 1 }

 

Set 객체는 배열이나 객체와 같은 객체 타입을 요소로 가질 수도 있다.

const set = new Set();

set.add([1, 2]);

console.log(set); // Set(1) { [ 1, 2 ] }

이때 주의해야 할 점은 원시값이 아닐 경우 Set 객체는 유일한 객체 참조 값을 저장한다는 점이다.

즉, 참조값이 다른 두 객체는 서로 다른 객체로 보고 Set에 저장된다.

const set = new Set();

set.add([1, 2]);

console.log(set); // Set(1) { [ 1, 2 ] }

set.add([1, 2]);

console.log(set); // Set(2) { [ 1, 2 ], [ 1, 2 ] }

이와 같이 Set 객체에 추가한 두 배열 [1, 2]와 [1, 2]는 서로 다른 참조값을 가지므로 서로 다른 두 요소로서 Set 객체에 저장된 것을 알 수 있다.

 

그렇다면 요소를 삭제할 경우는 어떨까?

먼저 Set 객체의 원시값을 삭제하는 경우를 살펴보자.

다음과 같이 Set.prototype.delete 메서드를 이용하면 Set 객체의 특정 요소를 삭제할 수 있다.

const set = new Set([1, 2, 3]);

console.log(set); // Set(3) { 1, 2, 3 }

set.delete(2);

console.log(set); // Set(2) { 1, 3 }

하지만 요소가 객체 타입인 경우에는 삭제하려는 객체의 참조값을 전달하지 않으면 객체를 삭제할 수 없다.

const set = new Set([
  [1, 2],
  [1, 2]
]);

console.log(set); // Set(2) { [ 1, 2 ], [ 1, 2 ] }

set.delete([1, 2]);

console.log(set); // Set(2) { [ 1, 2 ], [ 1, 2 ] }

 

지금까지 Set 객체의 요소가 각각 원시값과 객체 타입일 때 Set 객체에 요소를 추가하고 삭제하는 방법과 차이점을 살펴보았다.

Set 객체가 객체 타입의 요소를 가질 경우에는 객체의 유일한 참조값을 저장한다는 것을 기억하고 잘못 사용하는 일이 없도록 하자.

반응형