어제 오늘 내일

[Java] Collections.unmodifiableList() – 읽기 전용 리스트 만들기 본문

IT/Java

[Java] Collections.unmodifiableList() – 읽기 전용 리스트 만들기

hi.anna 2025. 9. 13. 02:17

Java에서 컬렉션을 외부로 반환할 때, 의도치 않게 데이터가 수정되는 경우가 있습니다.
이를 막고 싶을 때 사용할 수 있는 방법이 바로 Collections.unmodifiableList() 입니다.
이 메서드를 이용하면 리스트를 **읽기 전용(Read-Only)**으로 감싸 안전하게 다룰 수 있습니다.

 

1. 기본 사용법

import java.util.*;

public class UnmodifiableListExample1 {
    public static void main(String[] args) {
        List<String> original = new ArrayList<>();
        original.add("Apple");
        original.add("Banana");

        List<String> unmodifiable = Collections.unmodifiableList(original);

        System.out.println(unmodifiable); // [Apple, Banana]
    }
}

👉 unmodifiableList()는 원본 리스트를 감싸는 읽기 전용 뷰(View)를 생성합니다.

 

2. 수정 불가능

읽기 전용 뷰에서는 추가, 삭제, 변경이 모두 불가능합니다.

unmodifiable.add("Cherry");   // UnsupportedOperationException 발생
unmodifiable.remove("Apple"); // UnsupportedOperationException 발생
unmodifiable.set(0, "Orange"); // UnsupportedOperationException 발생

👉 단순히 get(), size() 같은 읽기 연산만 가능합니다.

 

3. 원본 리스트는 여전히 수정 가능

주의할 점은, unmodifiableList()원본을 복사하는 것이 아니라 감싸는 것이라는 사실입니다.

original.add("Cherry");
System.out.println(unmodifiable); // [Apple, Banana, Cherry]

👉 즉, 원본이 바뀌면 읽기 전용 리스트에도 그대로 반영됩니다.

 

4. 언제 사용하면 좋을까?

  • API에서 컬렉션 반환할 때
    → 외부에서 리스트를 수정하지 못하게 막음
  • 데이터 무결성 보장
    → 예기치 않은 수정으로 인한 버그 방지
  • 읽기 전용 뷰 제공
    → 내부적으로는 수정 가능하지만 외부에는 안전한 접근만 허용

 

5. 진짜 불변 리스트가 필요하다면?

Collections.unmodifiableList()는 원본을 수정할 수 있기 때문에 완전한 불변 리스트(Immutable List)는 아닙니다.
완전한 불변 리스트가 필요하다면 Java 9 이상에서 제공하는 List.of()를 사용하는 것이 더 적합합니다.

List<String> immutable = List.of("A", "B", "C");

👉 이 경우 원본 자체도 수정 불가능합니다.

 

6. 정리

  • Collections.unmodifiableList(list) → 리스트의 읽기 전용 뷰 생성
  • 뷰에서는 추가/삭제/수정 불가능
  • 단, 원본 리스트가 바뀌면 뷰도 함께 바뀜
  • 외부에 안전하게 리스트를 반환할 때 유용
  • 진짜 불변 리스트는 List.of() 사용

👉 리스트를 외부에 안전하게 공유하고 싶다면 Collections.unmodifiableList()를 쓰자!

 

 

반응형
Comments