집합(Set)은 고유한 값만을 저장하는 자료구조로, 배열과 유사하지만 중요한 차이점을 가지고 있습니다.
집합과 배열의 주요 차이점
- 고유성: 집합은 중복 값을 허용하지 않아 자동으로 중복 제거 기능을 제공합니다. 반면 배열은 동일한 값을 여러 번 포함할 수 있습니다.
- 정렬 여부: 집합은 요소의 순서를 보장하지 않는 반면, 배열은 삽입된 순서를 유지합니다.
- 성능 특성: 집합은 검색 작업에 최적화되어 빠른 성능을 제공하고, 배열은 순차적인 접근에 적합합니다.
집합의 기본 사용법
생성 방법
빈 집합 생성 후 요소 추가:
const uniqueCollection = new Set();
uniqueCollection.add('apple');
uniqueCollection.add('banana');
uniqueCollection.add('apple'); // 중복으로 추가되지 않음
uniqueCollection.add('orange');
console.log(uniqueCollection); // Set {'apple', 'banana', 'orange'}
배열로부터 직접 초기화:
const fruitSet = new Set(['apple', 'banana', 'apple', 'orange']);
console.log(fruitSet); // Set {'apple', 'banana', 'orange'}
핵심 메서드와 속성
- size: 집합 내 요소 개수 확인
console.log(fruitSet.size); // 3
- add(value): 새로운 값 추가
fruitSet.add('grape');
- delete(value): 특정 값 제거 및 성공 여부 반환
const isDeleted = fruitSet.delete('banana');
console.log(isDeleted); // true
- has(value): 값 존재 여부 확인
console.log(fruitSet.has('banana')); // false
- clear(): 모든 요소 제거
fruitSet.clear();
순회 방법
- keys(): 키 이터레이터 반환
for (const key of fruitSet.keys()) {
console.log(key);
}
- values(): 값 이터레이터 반환
for (const value of fruitSet.values()) {
console.log(value);
}
- entries(): [값, 값] 형태의 이터레이터 반환
for (const entry of fruitSet.entries()) {
console.log(entry); // ['apple', 'apple'], ['orange', 'orange']
}
- forEach(): 각 요소에 대해 콜백 실행
fruitSet.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
- for...of: 이터러블 특성을 이용한 순회
for (const item of fruitSet) {
console.log(item);
}
집합을 배열로 변환하기
스프레드 연산자 사용:
const fruitArray = [...fruitSet];
console.log(fruitArray);
Array.from() 메서드 사용:
const convertedArray = Array.from(fruitSet);
console.log(convertedArray);
복잡한 데이터 구조의 중복 제거
function removeDuplicates(dataArray) {
const seenObjects = new Set();
return dataArray.filter(element => {
const elementKey = typeof element === 'object' && element !== null
? JSON.stringify(element)
: element;
if (seenObjects.has(elementKey)) {
return false;
} else {
seenObjects.add(elementKey);
return true;
}
});
}
const mixedData = [
42,
'test',
{user: 'john'},
{user: 'john'},
{user: 'jane'},
[5, 6],
[7, 8],
[5, 6],
null,
NaN,
null,
NaN
];
const uniqueData = removeDuplicates(mixedData);
console.log(uniqueData);
집합과 약한집합(WeakSet)의 차이점
- 값의 타입: WeakSet은 객체만을 값으로 받을 수 있으며, Set은 모든 타입을 허용합니다.
- 메모리 관리: WeakSet의 객체는 약한 참조로 처리되어 다른 참조가 없을 경우 가비지 컬렉션의 대상이 됩니다. Set의 객체는 강한 참조로 유지됩니다.
- 제한된 기능: WeakSet은 keys(), values(), entries(), forEach() 메서드와 size 속성을 지원하지 않습니다.