두 개의 집합을 더하는 연산을 합집합(Union)이라고 합니다. 합집합을 구하려면 한 집합의 모든 요소를 다른 집합에 추가하면서 중복 여부를 확인해야 합니다. 다행히 앞서 이미 구현한 메서드들을 활용하면 이 기능을 손쉽게 만들 수 있습니다.
이 함수는 정적(static) 함수로 구현하는 것이 좋습니다. 기존 집합을 변경(mutation)하는 대신 새로운 집합을 생성하여 반환하기 때문입니다. 먼저 전달된 객체가 실제로 MySet 클래스의 인스턴스인지 검사하는 과정이 필요합니다.
구현 예제
static union(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.add(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.union(testSet1, testSet2); testSet3.display();
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
{ '1': '1', '2': '2', '5': '5' }주목할 점은 ES6의 표준 Set API에도 union 함수가 포함되어 있지 않다는 것입니다. 다음과 같이 작성하면 이 함수를 표준 Set 클래스에서도 사용할 수 있도록 확장할 수 있습니다.
ES6 Set 클래스 확장
Set.union = 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.add(elem));
return newSet;
}마찬가지로 아래 코드로 동작을 확인할 수 있습니다.
테스트 예제
let setA = new Set([1, 2, 3, 4]); let setB = new Set([2, 3]); console.log(Set.union(setA, setB));
실행 결과
위 코드를 실행하면 중복 없이 모든 요소가 포함된 새로운 집합이 출력됩니다.
Set { 1, 2, 3, 4 }