Java에서 두 개의 Set 컬렉션을 하나로 합치는 작업은 실무에서 자주 마주치는 상황입니다. 가장 간단하고 안전한 방법 중 하나는 스트림(Stream) API로 원본 집합을 복사한 뒤, addAll() 메서드를 사용해 다른 집합의 요소를 추가하는 것입니다.
예제 코드
import java.util.stream.*;
import java.util.*;
import java.io.*;
public class Demo{
public static <T> Set<T> set_merge(Set<T> set_1, Set<T> set_2){
Set<T> my_set = set_1.stream().collect(Collectors.toSet());
my_set.addAll(set_2);
return my_set;
}
public static void main(String[] args){
Set<Integer> my_set_1 = new HashSet<Integer>();
my_set_1.addAll(Arrays.asList(new Integer[] { 34, 67, 89, 102 }));
Set<Integer> my_set_2 = new HashSet<Integer>();
my_set_2.addAll(Arrays.asList(new Integer[] { 77, 11, 0 , -33}));
System.out.println("The first set contains " + my_set_1);
System.out.println("The second set contains " + my_set_2);
System.out.println("The two sets are merged " + set_merge(my_set_1, my_set_2));
}
}
출력 결과
The first set contains [34, 67, 102, 89] The second set contains [0, -33, 11, 77] The two sets are merged [0, -33, 34, 67, 102, 89, 11, 77]
코드 설명
Demo 클래스 안에는 set_merge라는 제네릭 정적 메서드가 정의되어 있습니다. 이 메서드는 두 개의 집합을 매개변수로 전달받으며, 먼저 첫 번째 집합을 스트림으로 변환해 Collectors.toSet()으로 새로운 집합에 수집합니다. 이후 addAll() 메서드를 호출하여 두 번째 집합의 모든 요소를 새 집합에 추가한 뒤 결과를 반환합니다.
main 메서드에서는 HashSet으로 두 개의 집합을 생성하고, Arrays.asList()와 addAll()을 조합해 각각 요소를 채워 넣습니다. 마지막으로 콘솔에 관련 메시지를 출력하여 원본 집합 두 개와 병합된 최종 결과를 확인할 수 있습니다.
알아두면 좋은 점
위 코드는 원본 집합을 직접 수정하지 않고 새로운 집합을 만들어 반환하기 때문에 기존 데이터가 변경될 염려가 없습니다. 참고로 Java 8 이상 환경에서는 Stream.concat(set_1.stream(), set_2.stream()).collect(Collectors.toSet())처럼 한 줄로도 병합이 가능하며, new HashSet<>(set_1) 복사 생성자를 활용한 뒤 addAll()을 호출하는 방식 역시 널리 사용되는 대안입니다.