자바스크립트에는 이미 내장된 Set 클래스가 있지만, 집합 자료구조의 동작 원리를 깊이 이해하려면 직접 구현해 보는 것이 좋습니다. 이 글에서는 내장 Set 클래스와 이름이 겹치지 않도록 MySet 클래스를 만들어 보겠습니다.
MySet 클래스 기본 구조
먼저, 집합에 추가되는 모든 값을 저장할 컨테이너 객체를 생성합니다. 그리고 현재 집합의 상태를 출력해 주는 display 함수도 함께 정의합니다.
예제
class MySet {
constructor() {
this.container = {};
}
display() {
console.log(this.container);
}
}컨테이너는 일반 객체({})로 구현했는데, 객체의 키는 중복될 수 없다는 특성 덕분에 집합의 '중복 없음' 원칙을 자연스럽게 만족시킬 수 있습니다.
ES6 내장 Set 클래스 활용하기
ES6(ECMAScript 2015)부터는 Set 클래스를 사용해 집합을 바로 생성할 수 있습니다. 생성자에 배열을 전달하면 해당 값들로 초기화된 집합이 만들어집니다.
예제
const set1 = new Set(); // 빈 집합 생성 const set2 = new Set([1, 2, 5, 6]); // 초기값을 가진 집합 생성
내장 Set은 중복된 값을 자동으로 제거하므로, 배열에 같은 값이 여러 번 포함되어 있어도 집합에는 한 번만 저장됩니다.
원소 존재 여부 확인하기 (has 메서드)
집합에서 가장 기본적인 연산 중 하나는 특정 값이 집합에 존재하는지 확인하는 것입니다. MySet 클래스에서는 has 메서드를 구현하고, 내부적으로 Object.hasOwnProperty를 사용해 컨테이너에 해당 키가 있는지 검사합니다.
예제
has(val) {
return this.container.hasOwnProperty(val);
}ES6 내장 Set에서는 별도 구현 없이 has 메서드를 바로 사용할 수 있습니다.
예제
const testSet = new Set([1, 2, 5, 6]); console.log(testSet.has(5)); console.log(testSet.has(20)); console.log(testSet.has(1));
출력 결과
true false true
값 5와 1은 집합에 존재하므로 true가 반환되고, 존재하지 않는 20에 대해서는 false가 반환됩니다.
정리
이처럼 단순한 객체와 hasOwnProperty만으로도 집합의 핵심 기능인 멤버십 검사를 손쉽게 구현할 수 있습니다. 다음 단계로는 add(추가), delete(삭제), clear(전체 비우기) 같은 메서드를 확장하여 완전한 집합 자료구조를 만들어 볼 수 있습니다.