Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9에서 불변(Immutable) 컬렉션을 초기화하는 방법 총정리

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의 출력 순서가 입력 순서와 다르게 나타날 수 있습니다.