Java 9부터는 팩토리 메서드(factory method)를 사용하여 불변(immutable) 리스트, 셋(Set), 맵(Map)을 손쉽게 생성할 수 있습니다. 이를 통해 빈(empty) 컬렉션 또는 요소가 있는(non-empty) 컬렉션 객체를 간편하게 만들 수 있습니다.
Java 8 이전 버전에서는 Collections 클래스의 유틸리티 메서드인 unmodifiableXXX()를 활용해 불변 컬렉션 객체를 생성했습니다. 예를 들어, 불변 리스트가 필요하다면 Collections.unmodifiableList() 메서드를 사용해야 했습니다.
반면 Java 9의 팩토리 메서드는 별도의 변환 과정 없이 한 줄의 코드로 불변 컬렉션을 직접 초기화할 수 있어 훨씬 더 간결하고 직관적입니다.
불변 리스트(List) 초기화하기
List<Integer> immutableEmptyList = List.of();
위 코드는 요소가 없는 빈 불변 리스트를 초기화합니다.
불변 셋(Set) 초기화하기
Set<Integer> immutableEmptySet = Set.of();
위 코드는 요소가 없는 빈 불변 셋을 초기화합니다.
불변 맵(Map) 초기화하기
Map<Integer, Integer> immutableEmptyMap = Map.of();
위 코드는 요소가 없는 빈 불변 맵을 초기화합니다.
전체 예제 코드
아래 예제에서는 Java 8 방식(Collections.unmodifiableList())과 Java 9 방식(List.of(), Set.of(), Map.of())을 비교하여 보여줍니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ImmutableCollectionTest {
public static void main(String args[]) {
// Java 8 방식: unmodifiableList() 사용
List<String> list8 = new ArrayList<String>();
list8.add("INDIA");
list8.add("AUSTRALIA");
list8.add("ENGLAND");
list8.add("NEWZEALAND");
List<String> immutableList8 = Collections.unmodifiableList(list8);
immutableList8.forEach(System.out::println);
System.out.println();
// Java 9 방식: List.of() 사용
List<String> immutableList = List.of("INDIA", "AUSTRALIA", "ENGLAND", "NEWZEALAND");
immutableList.forEach(System.out::println);
System.out.println();
// Java 9 방식: Set.of() 사용
Set<String> immutableSet = Set.of("INDIA", "AUSTRALIA", "ENGLAND", "NEWZEALAND");
immutableSet.forEach(System.out::println);
System.out.println();
// Java 9 방식: Map.of() 사용
Map<String, String> immutableMap = Map.of("INDIA", "India", "AUSTRALIA", "Australia", "ENGLAND", "England", "NEWZEALAND", "Newzealand");
immutableMap.forEach((key, value) -> System.out.println(key + " : " + value));
System.out.println();
}
}실행 결과
INDIA AUSTRALIA ENGLAND NEWZEALAND INDIA AUSTRALIA ENGLAND NEWZEALAND AUSTRALIA ENGLAND NEWZEALAND INDIA AUSTRALIA : Australia ENGLAND : England NEWZEALAND : Newzealand INDIA : India
참고 사항
불변 컬렉션에 요소를 추가하거나 삭제하려고 하면 UnsupportedOperationException이 발생합니다. 또한 Set.of()와 Map.of()로 생성된 컬렉션은 내부적으로 순서가 보장되지 않으므로, 실행 결과에서 Set과 Map의 출력 순서가 입력 순서와 다르게 나타날 수 있습니다.