이 글에서는 Java를 사용해 두 개의 Set(집합) 사이의 차이(차집합)를 계산하는 방법을 알아봅니다.
Set은 중복 요소를 허용하지 않는 컬렉션(Collection)으로, 수학의 집합 개념을 프로그래밍으로 구현한 것입니다. Set 인터페이스는 Collection 인터페이스에서 상속받은 메서드만 사용하며, 여기에 '중복 요소 금지'라는 제약 조건이 추가됩니다.
두 집합의 차집합이란, 첫 번째 집합에는 포함되어 있지만 두 번째 집합에는 없는 요소들만 남기는 연산입니다. Java에서는 removeAll() 메서드 하나만으로 이 연산을 손쉽게 처리할 수 있습니다.
동작 예시
입력이 다음과 같다고 가정해 보겠습니다.
첫 번째 집합: [90, 75, 60, 45] 두 번째 집합: [90, 60]
원하는 출력 결과는 다음과 같습니다.
두 집합의 차집합: [75, 45]
알고리즘
1단계 - 시작 2단계 - 필요한 변수를 선언합니다. 3단계 - 값을 정의합니다. 4단계 - 두 개의 Set을 생성하고, 'add' 메서드로 요소를 추가합니다. 5단계 - Set의 내용을 콘솔에 출력합니다. 6단계 - 'removeAll' 메서드를 사용해 두 집합의 차집합을 계산합니다. 7단계 - 차집합 결과를 콘솔에 출력합니다. 8단계 - 종료
removeAll() 메서드란?
removeAll(Collection c)는 호출한 집합에서 매개변수로 전달된 컬렉션에 포함된 모든 요소를 제거하는 메서드입니다. 즉, A.removeAll(B)를 실행하면 A에서 B와 겹치는 요소가 모두 삭제되어 수학의 차집합(A − B)과 동일한 결과를 얻을 수 있습니다.
예제 1: main 함수에서 모든 로직 처리
아래 예제는 모든 연산을 main 함수 안에서 한 번에 처리하는 방식입니다.
import java.util.HashSet;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
System.out.println("필요한 패키지를 가져왔습니다");
Set<Integer> input_set_1 = new HashSet<>();
input_set_1.add(45);
input_set_1.add(60);
input_set_1.add(75);
input_set_1.add(90);
System.out.println("첫 번째 집합: " + input_set_1);
Set<Integer> input_set_2 = new HashSet<>();
input_set_2.add(60);
input_set_2.add(90);
System.out.println("두 번째 집합: " + input_set_2);
input_set_1.removeAll(input_set_2);
System.out.println("\n두 집합의 차집합:\n" + input_set_1);
}
}실행 결과
필요한 패키지를 가져왔습니다 첫 번째 집합: [90, 75, 60, 45] 두 번째 집합: [90, 60] 두 집합의 차집합: [75, 45]
예제 2: 객체 지향 방식으로 함수 분리
아래 예제는 연산 로직을 별도의 함수로 캡슐화하여 객체 지향 프로그래밍 스타일로 작성한 것입니다. 코드의 재사용성과 가독성이 더욱 향상됩니다.
import java.util.HashSet;
import java.util.Set;
public class Demo {
static void subtract(Set<Integer> input_set_1, Set<Integer> input_set_2){
input_set_1.removeAll(input_set_2);
System.out.println("\n두 집합의 차집합:\n" + input_set_1);
}
public static void main(String[] args) {
System.out.println("필요한 패키지를 가져왔습니다");
Set<Integer> input_set_1 = new HashSet<>();
input_set_1.add(45);
input_set_1.add(60);
input_set_1.add(75);
input_set_1.add(90);
System.out.println("첫 번째 집합: " + input_set_1);
Set<Integer> input_set_2 = new HashSet<>();
input_set_2.add(60);
input_set_2.add(90);
System.out.println("두 번째 집합: " + input_set_2);
subtract(input_set_1, input_set_2);
}
}실행 결과
필요한 패키지를 가져왔습니다 첫 번째 집합: [90, 75, 60, 45] 두 번째 집합: [90, 60] 두 집합의 차집합: [75, 45]
정리
두 Set의 차이를 구하는 핵심은 removeAll() 메서드입니다. 첫 번째 집합에서 두 번째 집합의 요소들을 모두 제거하면 자연스럽게 차집합이 완성됩니다. 참고로 원본 집합을 유지해야 하는 경우에는 HashSet 객체를 새로 복사한 뒤 removeAll()을 호출하는 것이 안전합니다.