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

Java 9에서 수정 불가능한(불변) Set 만들기 – Set.of() 메서드 완벽 정리

Java 9에서 도입된 불변(immutable) 정적 팩토리 메서드 Set.of()를 사용하면 수정 불가능한(unmodifiable) Set을 아주 간편하게 생성할 수 있습니다. 기존에는 Collections.unmodifiableSet() 등을 활용해 번거롭게 불변 컬렉션을 만들어야 했지만, Java 9부터는 한 줄의 코드로 손쉽게 처리할 수 있습니다.

이 메서드로 생성된 Set 인스턴스는 다음과 같은 특징을 가집니다.

  • 불변성(Immutability): 팩토리 메서드가 반환하는 Set은 규약상 불변(immutable)입니다. 즉, 요소를 추가(add), 삭제(remove), 교체(replace)할 수 없으며, 변경자(mutator) 메서드를 호출하면 UnsupportedOperationException이 발생합니다.
  • 요소의 가변성: Set에 담긴 요소 자체가 가변(mutable) 객체라면, 해당 객체의 내부 상태가 변경될 때 Set의 내용도 달라진 것처럼 보일 수 있습니다.
  • null 요소 금지: 정적 팩토리 메서드는 null 요소를 허용하지 않습니다. null을 포함해 생성하려고 하면 NullPointerException이 발생합니다.
  • 중복 요소 거부: 불변 Set 생성 시점에 중복 요소를 허용하지 않습니다. 중복된 값을 전달하면 IllegalArgumentException이 발생합니다.
  • 순서 미보장: Set 요소의 반복(iteration) 순서는 명시되어 있지 않으며(unspecified), 언제든 변경될 수 있습니다.

문법(Syntax)

Set.of(E... elements)

예제 코드

import java.util.Set;
public class SetOfMethodTest {
   public static void main(String args[]) {
      Set<String> names = Set.of("Adithya", "Bhavish", "Chaitanya", "Jai");
      System.out.println("Names - " + names);
      names.add("Raja");       // UnsupportedOperationException 발생
   }
}

실행 결과

Names - [Bhavish, Adithya, Jai, Chaitanya]
Exception in thread "main" java.lang.UnsupportedOperationException
 at java.base/java.util.ImmutableCollections.uoe(Unknown Source)
 at java.base/java.util.ImmutableCollections$AbstractImmutableSet.add(Unknown Source)
   at SetOfMethodTest.main(SetOfMethodTest.java:8)

위 예제에서 볼 수 있듯이, Set.of()로 생성한 불변 Set에 add() 메서드로 새로운 요소를 추가하려 하면 런타임에 UnsupportedOperationException 예외가 발생합니다. 따라서 데이터가 생성 이후 변경되지 않아야 하는 경우에 Set.of()를 활용하면 코드의 안정성과 예측 가능성을 크게 높일 수 있습니다.