JAVA

[JAVA] Immutable List (불변 리스트)

인생아 2024. 11. 18. 11:26
반응형

Java에서는 데이터를 보호하고 안정성을 높이기 위해 불변 리스트(Immutable List)를 사용할 수 있습니다. 불변 리스트는 읽기 전용 데이터 구조로, 생성된 이후에는 데이터를 변경할 수 없습니다. 여기에서는 불변 리스트의 필요성, Collections.unmodifiableList(), Java 9 이상의 List.of() 활용 방법에 대해 설명하고, 관련 예제를 제공합니다.

1. 불변 리스트의 필요성

불변 리스트란?

불변 리스트는 수정할 수 없는 리스트로, 다음과 같은 특징이 있습니다.

  • 요소를 추가, 삭제, 수정할 수 없음
  • 스레드 안전성(Thread Safety) 보장
  • 데이터 무결성 유지

왜 불변 리스트가 필요할까?

  1. 데이터 보호: 외부에서 리스트를 수정할 수 없으므로 원본 데이터를 안전하게 유지할 수 있습니다.
  2. 스레드 안전성: 다중 스레드 환경에서도 불변 리스트는 데이터 동기화 없이 사용할 수 있어 경합 조건(Race Condition) 문제를 방지합니다.
  3. 코드 가독성: 데이터를 변경할 의도가 없음을 명확히 나타내므로 코드의 가독성이 향상됩니다.

예제: 불변 리스트가 없는 경우의 문제점

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

public class Main {
    public static void main(String[] args) {
        List<String> cities = new ArrayList<>();
        cities.add("서울");
        cities.add("부산");

        modifyList(cities); // 외부 함수에서 리스트가 변경됨
        System.out.println("원본 리스트: " + cities); // 예상치 못한 데이터 변경
    }

    public static void modifyList(List<String> list) {
        list.add("대전");
    }
}

출력 결과

원본 리스트: [서울, 부산, 대전]

이와 같은 상황을 방지하려면 불변 리스트를 사용하는 것이 효과적입니다.

반응형

2. Collections.unmodifiableList()

Java는 Collections.unmodifiableList() 메서드를 제공하여 기존 리스트를 읽기 전용으로 변환할 수 있습니다.

기본 사용법

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

public class Main {
    public static void main(String[] args) {
        List<String> cities = new ArrayList<>();
        cities.add("서울");
        cities.add("부산");

        List<String> immutableCities = Collections.unmodifiableList(cities);

        System.out.println("불변 리스트: " + immutableCities);

        // immutableCities.add("대전"); // UnsupportedOperationException 발생
    }
}

주의점

unmodifiableList로 생성된 리스트는 원본 리스트에 의존적입니다. 즉, 원본 리스트가 변경되면 불변 리스트도 영향을 받습니다.

List<String> cities = new ArrayList<>();
cities.add("서울");

List<String> immutableCities = Collections.unmodifiableList(cities);
cities.add("부산"); // 원본 리스트 변경

System.out.println(immutableCities); // [서울, 부산] 출력

3. Java 9 이상의 List.of() 활용

Java 9부터 제공되는 List.of() 메서드는 불변 리스트를 더 간단하게 생성할 수 있도록 지원합니다. 이 메서드는 내부적으로 완전한 불변성을 보장하며, 원본 데이터에 영향을 받지 않습니다.

기본 사용법

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> cities = List.of("서울", "부산", "대구");
        System.out.println("불변 리스트: " + cities);

        // cities.add("대전"); // UnsupportedOperationException 발생
    }
}

Java 9의 장점

  1. 코드 간결성: 한 줄로 불변 리스트 생성 가능
  2. 내장 불변성: 원본 리스트와 독립적으로 작동
  3. 성능 최적화: 추가적인 동기화 코드 불필요

List.of()와 Collections.unmodifiableList()의 차이점

기능Collections.unmodifiableList()List.of()

원본 데이터 영향 여부 Java 버전 생성 코드
영향을 받음 Java 1.2 이상 약간 복잡
영향을 받지 않음 Java 9 이상 매우 간단

4. 다양한 예제

불변 리스트와 함수 인자 활용

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> immutableList = List.of("김철수", "이영희");

        printNames(immutableList);
    }

    public static void printNames(List<String> names) {
        for (String name : names) {
            System.out.println("이름: " + name);
        }
    }
}

불변 리스트와 데이터 처리

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = List.of(1, 2, 3, 4, 5);

        int sum = numbers.stream().mapToInt(Integer::intValue).sum();
        System.out.println("합계: " + sum);
    }
}

참고 사이트

Java 공식 문서: https://docs.oracle.com/javase/9/docs/api/java/util/List.html

반응형