반응형
Java에서는 데이터를 보호하고 안정성을 높이기 위해 불변 리스트(Immutable List)를 사용할 수 있습니다. 불변 리스트는 읽기 전용 데이터 구조로, 생성된 이후에는 데이터를 변경할 수 없습니다. 여기에서는 불변 리스트의 필요성, Collections.unmodifiableList(), Java 9 이상의 List.of() 활용 방법에 대해 설명하고, 관련 예제를 제공합니다.
1. 불변 리스트의 필요성
불변 리스트란?
불변 리스트는 수정할 수 없는 리스트로, 다음과 같은 특징이 있습니다.
- 요소를 추가, 삭제, 수정할 수 없음
- 스레드 안전성(Thread Safety) 보장
- 데이터 무결성 유지
왜 불변 리스트가 필요할까?
- 데이터 보호: 외부에서 리스트를 수정할 수 없으므로 원본 데이터를 안전하게 유지할 수 있습니다.
- 스레드 안전성: 다중 스레드 환경에서도 불변 리스트는 데이터 동기화 없이 사용할 수 있어 경합 조건(Race Condition) 문제를 방지합니다.
- 코드 가독성: 데이터를 변경할 의도가 없음을 명확히 나타내므로 코드의 가독성이 향상됩니다.
예제: 불변 리스트가 없는 경우의 문제점
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의 장점
- 코드 간결성: 한 줄로 불변 리스트 생성 가능
- 내장 불변성: 원본 리스트와 독립적으로 작동
- 성능 최적화: 추가적인 동기화 코드 불필요
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
반응형
'JAVA' 카테고리의 다른 글
[JAVA] List 자주 사용하는 유틸리티 메서드와 트릭 (0) | 2024.11.21 |
---|---|
[JAVA] List 자주 발생하는 문제와 해결법 (1) | 2024.11.20 |
[JAVA] List성능 비교와 최적화 (0) | 2024.11.19 |
[JAVA] List 활용 (2) | 2024.11.18 |
[JAVA] List와 동기화 (0) | 2024.11.18 |
[JAVA] List 반복문을 활용한 처리 (0) | 2024.11.17 |
[JAVA] List의 데이터 변환과 처리 (0) | 2024.11.17 |
[JAVA] List의 데이터 정렬과 검색 (1) | 2024.11.17 |