티스토리 뷰

Java 9 부터 List 생성 시  List.of()  메소드를 사용할 수 있게 되었습니다. 이를 알게 된 이후로 자주 이 메소드를 사용해서 List 생성을 해왔습니다.

그런데 코딩을 하던 중 이렇게 만든 리스트에 값을 변경( add()  등)하는 일이 생겼는데 다음과 같은 에러가 발생했습니다.

 

Exception in thread "main" java.lang.UnsupportedOperationException

 

해당 연산을 지원하지 않는다는 것으로 해서는 안되는 연산을 해서 발생한 에러였습니다...

 

List.of() 메소드를 살펴보니 다음과 같았습니다.

static <E> List<E> of(E e1) {
    return new ImmutableCollections.List12<>(e1);
}

of 메소드는 불변 컬렉션 생성을 편하게 하기 위해 도입된 메소드입니다. 따라서 이후에 값을 변경할 가능성이 있는 경우 이 메서드를 사용해서 컬렉션을 생성하지 말았어야 했는데... 제대로 알아보지 않고 그냥 써왔네요... 😓

불변 컬렉션이란?

불변(Immutable) 컬렉션(Collection)은 아이템 추가, 수정, 제거가 불가능한 컬렉션으로 신규 아이템을 추가하거나 기존 아이템을 수정 또는 제거하려고 하면  java.lang.UnsupportedOperationException  이 발생합니다. 컬렉션이 생성된 후에 변경되기를 원하지 않는 경우에 사용하며, 의도치 않은 컬렉션 변경을 예방에 도움이 됩니다.

Java 9 이전 불변 컬렉션 생성

Java8까지는 불변(Immutable) 리스트를 만들기 위해서는 가변(mutalbe) 리스트를 먼저 만들고 Collections 클래스의 unmodifiableList() 정적 메서드를 사용하여 불변 리스트로 변환시켜줘야 했었습니다.

List<String> fruits = new ArrayList<>();

fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits = Collections.unmodifiableList(fruits);

fruits.add("Kiwi"); // UnsupportedOperationException

위와 같은 번거로움을 조금이나마 덜기 위해 Java 8에서는 다음과 같은 방법 등을 사용할 수 있었습니다.

  • Arrays API :  Arrays.asList("aaa", "bbb", "ccc") 
  • Stream API :  Stream.of("aaa", "bbb", "ccc").collect(collectingAndThen(toList(), Collections::unmodifiableList)) 
  • Guava 라이브러리 :  ImmutableList.of("aaa", "bbb", "ccc") 

Java 9 부터 불변 컬렉션을 생성하고자 한다면  List.of() / Set.of() / Map.of(), Map.ofEntries()  를 사용하면 쉽게 생성이 가능합니다.

그게 아니라 변경이 가능한 List를 생성하고자 한다면 기존처럼 new 키워드를 사용하여 생성하면 됩니다.

List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");

// 선언과 동시에 초기화하려면 아래와 같이
List<String> list = new ArrayList<>(){{
    add("aaa");
    add("bbb");
    add("ccc");
}};

참고

'JAVA' 카테고리의 다른 글

[IntelliJ Live Template] 자주 쓰는 코드 템플릿 등록하기  (1) 2023.10.19
[Collection] 일급 컬렉션  (0) 2023.02.09
[JAVA] Annotation 알아보기  (0) 2022.02.19
[Java Version] Java 8 vs 11vs 17  (0) 2022.02.11
[Java] stream 알아보기  (0) 2022.02.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함