리스트의 불변(unmodifiable) 인스턴스가 한 번 생성되면 해당 리스트에서 요소를 추가, 삭제 또는 교체할 수 없을 때, 이 리스트를 수정할 수 없는 리스트라고 합니다. Java 9에서는 정적 팩토리 메서드인 List.of()를 통해 이러한 불변 리스트를 매우 간편하게 생성할 수 있습니다.
List.of() 메서드로 생성된 리스트 인스턴스는 다음과 같은 특징을 가집니다.
- 팩토리 메서드가 반환하는 리스트는 관례상 불변(immutable)입니다. 즉, 요소를 추가, 삭제 또는 교체할 수 없으며, 리스트에 대해 변경자(mutator) 메서드를 호출하면 UnsupportedOperationException이 발생합니다.
- 리스트에 담긴 요소 자체가 가변(mutable) 객체라면, 리스트의 내용이 변경되는 것처럼 보일 수 있습니다.
- 정적 팩토리 메서드로 생성한 불변 리스트는 null 요소를 허용하지 않습니다. null 요소와 함께 생성을 시도하면 NullPointerException이 발생합니다.
- 모든 요소가 직렬화 가능(serializable)하다면, 불변 리스트 역시 직렬화 가능합니다.
- 리스트 내 요소의 순서는 메서드에 전달된 매개변수의 순서 또는 제공된 배열의 요소 순서와 동일하게 유지됩니다.
문법
List.of(E... elements)
예제 코드
아래 예제에서는 List.of()를 사용해 불변 리스트를 생성하고, 여기에 새로운 요소를 추가하려고 시도했을 때 어떤 일이 발생하는지 확인할 수 있습니다.
import java.util.List;
public class UnmodifiedListTest {
public static void main(String[] args) {
List<String> countries = List.of("India", "Australia", "England", "Newzealand");
System.out.println("Countries - " + countries);
countries.add("Srilanka"); // UnsupportedOperationException 발생
}
}실행 결과
Countries - [India, Australia, England, Newzealand] Exception in thread "main" java.lang.UnsupportedOperationException at java.base/java.util.ImmutableCollections.uoe(Unknown Source) at java.base/java.util.ImmutableCollections$AbstractImmutableList.add(Unknown Source) at UnmodifiedListTest.main(UnmodifiedListTest.java:7)
위 실행 결과에서 볼 수 있듯이, List.of()로 생성된 리스트에 add() 메서드로 새로운 요소를 추가하려 하면 UnsupportedOperationException이 발생합니다. 따라서 데이터가 변경되지 않아야 하는 상황에서는 List.of()를 활용해 안전하게 불변 리스트를 구성하는 것이 좋습니다.