순서가 없는 중복되지 않은 데이터의 집합입니다.
Set은 배열과 차이점을 이해하는 것이 중요합니다.
배열은 데이터를 순서있게 저장합니다. 그래서 인덱스를 통해서 특정 위치에 저장되어 있는 데이터에 접근이 가능합니다. 그리고 배열에는 동일한 값을 여러 번 저장할 수 있습니다. 값이 동일하더라도 인덱스가 틀리기 때문에 데이터의 중복에 문제가 되지 않습니다.
반면 Set은 얼핏 보기엔 배열과 비슷해 보일 수 있지만 사실 결이 아주 다른 자료구조입니다.
우선 Set은 데이터를 순서 없이 저장합니다. 따라서 배열처럼 인덱스를 통해서 접근할 수가 없습니다.
그리고 Set은 중복된 데이터를 허용하지 않습니다. 즉, 기존에 세트에 있는 값을 또 추가하면 아무 효력이 발생하지 않습니다.
자바스크립트에서 Set
은 클래스이기 때문에, new
키워드와 생성자를 활용해 인스턴스를 생성할 수 있습니다.
const mySet = new Set(); // Set(0) {}
.add()
메서드를 사용하여 Set
에 새로운 요소를 추가합니다.
Set
은 중복된 값을 저장하지 않으므로, 이미 존재하는 값을 추가하려고 하면 그 값은 무시됩니다.
mySet.add(1);
mySet.add(5);
mySet.add('text');
console.log(mySet) // Set(3) {1, 5, 'text'}
.delete
메서드를 사용하여 특정 값을 삭제합니다.
해당 값이 Set
내에 존재하면 삭제 후 true
를 반환하고, 존재하지 않으면 false
를 반환합니다.
mySet.delete(5);
세트에 특정 값이 존재하는지 확인하려면 has()
메서드를 사용합니다. 보통 if
조건문이나 3항 연산자(ternary operator)와 많이 사용됩니다.
console.log(mySet.has(1)); // true
console.log(mySet.has(3)); // false
.size
속성을 사용하여 Set
내 요소의 개수(크기)를 확인합니다.
console.log(mySet.size); // 2
for...of 루프를 사용하여 Set
의 모든 요소를 순회합니다.
for (let item of mySet) {
console.log(item)
}
Set
은 .forEach()
메서드도 지원합니다. 이 메서드를 사용하여 Set
의 모든 요소를 순회할 수 있습니다. 콜백 함수는 각 요소에 대해 실행됩니다.
mySet.forEach((value) => {
console.log(value)
}
실제로 코딩을 하다보면 기존에 존재하는 배열로 부터 새로운 세트를 만들어야 하는 경우가 빈번한데, 이 때는 Set() 생성자의 인자로 해당 배열이 할당된 변수를 넘기면 됩니다.
const array = [1, 2, 2, 3, 3, 3];
const mySet = new Set(array); // Set(3) {1, 2, 3}
반대로 세트를 배열로 변환할 수도 있습니다.
가장 쉬운 방법은 대괄호 안에서 세트를 상대로 전개(spread) 연산자를 사용하는 것입니다.
const array = [...mySet]; // [1, 2, 3]
전개 연산자를 별로 안 좋아하신다면 Array.from() 함수를 사용하는 방법도 있습니다.
const array = Array.from(set); // [1, 2, 3]
세트는 중복 값을 허용하지 않기 때문에, 배열이나 문자열에서 중복된 값을 제거하는 데에 매우 유용하게 활용될 수 있습니다.
const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = [...new Set(numbers)];
console.log(uniqueNumbers); // [1, 2, 3, 4, 5]
데이터의 유일성을 보장해야 하고, 순서가 중요하지 않으며, 빠른 검색과 집합 연산이 필요한 경우에 Set을 사용하는 것이 좋습니다.