두 집합의 차집합(difference)이란, 빼려는 집합(s2)에 포함된 모든 원소를 원본 집합(s1)에서 제거한 결과를 의미합니다. 따라서 두 번째 집합을 순회하면서 해당 원소들을 첫 번째 집합에서 하나씩 삭제하는 방식으로 차집합을 간단히 구현할 수 있습니다.
커스텀 Set 클래스에서 차집합 구현하기
아래는 자체 제작한 MySet 클래스에 정적(static) 메서드 형태로 차집합 기능을 추가한 예제입니다.
static difference(s1, s2) {
if (!(s1 instanceof MySet) || !(s2 instanceof MySet)) {
console.log("The given objects are not of type MySet");
return null;
}
let newSet = new MySet();
s1.forEach(elem => newSet.add(elem));
s2.forEach(elem => newSet.delete(elem));
return newSet;
}구현한 차집합 함수는 다음과 같이 테스트해 볼 수 있습니다.
테스트 예제
const testSet1 = new MySet(); testSet1.add(1); testSet1.add(2); const testSet2 = new MySet(); testSet2.add(2); testSet2.add(5); let testSet3 = MySet.difference(testSet1, testSet2); testSet3.display();
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
{ '1': 1 }testSet1에는 1과 2가 있고, testSet2에는 2와 5가 있으므로 공통 원소인 2가 제거되어 { 1 }만 남게 됩니다.
참고로 ES6의 표준 Set API에는 difference 메서드가 기본으로 포함되어 있지 않습니다. 하지만 아래와 같이 직접 Set 클래스에 정적 메서드로 추가하면 표준 Set 객체에서도 동일한 방식으로 차집합을 사용할 수 있습니다.
표준 Set 객체에 차집합 함수 추가하기
Set.difference = function(s1, s2) {
if (!(s1 instanceof Set) || !(s2 instanceof Set)) {
console.log("The given objects are not of type Set");
return null;
}
let newSet = new Set();
s1.forEach(elem => newSet.add(elem));
s2.forEach(elem => newSet.delete(elem));
return newSet;
}작성한 함수는 다음과 같이 호출하여 확인할 수 있습니다.
테스트 예제
let setA = new Set([1, 2, 3, 4]); let setB = new Set([2, 3]); console.log(Set.difference(setA, setB));
출력 결과
실행 결과는 다음과 같습니다.
Set { 1, 4 }setA에서 setB에 포함된 원소인 2와 3이 제거되어 최종적으로 { 1, 4 }라는 차집합이 생성됩니다.
최신 자바스크립트에서의 네이티브 지원
최신 자바스크립트 환경(ES2025 이상)에서는 Set.prototype.difference() 메서드가 표준으로 도입되었습니다. 따라서 최신 브라우저나 Node.js 버전을 사용한다면 별도의 구현 없이 setA.difference(setB)처럼 바로 호출하여 차집합을 구할 수 있으니, 프로젝트의 실행 환경을 먼저 확인해 보는 것이 좋습니다.