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

Java에서 ArrayList를 읽기 전용으로 만드는 방법

Java에서 ArrayList를 읽기 전용(read-only)으로 만들려면 java.util.Collections 클래스의 unmodifiableList() 메서드를 사용하면 됩니다. 이 메서드는 List 인터페이스를 구현한 객체(ArrayList 등)를 매개변수로 받아, 해당 리스트의 수정 불가능한(unmodifiable) 뷰를 반환합니다. 반환된 리스트에는 읽기 전용으로만 접근할 수 있으므로, 중요한 데이터를 의도치 않은 변경으로부터 안전하게 보호할 수 있습니다.

unmodifiableList() 메서드란?

Collections.unmodifiableList()는 원본 리스트를 복사하는 것이 아니라, 원본 리스트를 감싸는 읽기 전용 뷰(view)를 생성합니다. 따라서 이 뷰를 통해서는 요소를 추가, 삭제, 변경할 수 없습니다.

예제 1: ArrayList를 읽기 전용으로 변환하기

다음 Java 프로그램은 ArrayList 객체를 생성하고 요소를 추가한 뒤, 이를 읽기 전용 List 객체로 변환하는 과정을 보여줍니다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayListReadOnly {
    public static void main(String[] args) {
        // ArrayList 객체 생성
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaFx");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");
        System.out.println(list);

        // ArrayList를 읽기 전용 리스트로 변환
        List<String> myList = Collections.unmodifiableList(list);
        System.out.println("읽기 전용으로 변환된 리스트: " + myList);
    }
}

실행 결과

[JavaFx, Java, WebGL, OpenCV]
읽기 전용으로 변환된 리스트: [JavaFx, Java, WebGL, OpenCV]

읽기 전용 리스트 수정 시 주의사항

읽기 전용 뷰를 얻은 후에는 리스트의 내용을 수정할 수 없습니다. 직접 add()remove()를 호출하거나 Iterator 객체를 통해 요소를 추가·삭제하려고 시도하면 UnsupportedOperationException이 발생합니다.

예제 2: 수정 시도 시 발생하는 예외

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayListReadOnly {
    public static void main(String[] args) {
        // ArrayList 객체 생성
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaFx");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");
        System.out.println(list);

        // ArrayList를 읽기 전용 리스트로 변환
        List<String> myList = Collections.unmodifiableList(list);
        myList.add("CoffeeScript"); // 수정 시도 → 예외 발생!
        System.out.println("읽기 전용으로 변환된 리스트: " + myList);
    }
}

런타임 예외 출력

[JavaFx, Java, WebGL, OpenCV]
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
    at SEPTEMBER.remaining.ArrayListReadOnly.main(ArrayListReadOnly.java:20)

추가로 알아두면 좋은 점

  • 뷰(View) 방식: unmodifiableList()는 원본 리스트의 복사본이 아닌 뷰를 반환하므로, 원본 리스트가 변경되면 읽기 전용 뷰에도 그 변경 사항이 그대로 반영됩니다.
  • Java 9 이상: Java 9부터는 List.of() 메서드를 사용해 처음부터 불변(immutable) 리스트를 간편하게 생성할 수 있습니다. 예: List<String> list = List.of("Java", "WebGL");
  • 완전한 불변성 확보: 원본 참조를 통한 변경까지 차단하려면, 원본 리스트에 대한 참조를 제거하고 방어적 복사(defensive copy)를 만든 뒤 unmodifiableList()를 적용하는 것이 안전합니다.