[JAVA] 리스트

1. 리스트 생성하기

고정 값으로 List 만들기

리스트에 미리 정해진 값을 입력하여 생성합니다.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

배열로부터 List 만들기

배열을 기반으로 리스트를 생성합니다.

Integer[] arr = new Integer[]{1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr);

주의: 배열 타입이 기본 타입(int[])인 경우, 변환 시 오류가 발생합니다.

기존 리스트로 새로운 List 만들기

기존 리스트의 내용을 기반으로 새로운 리스트를 생성합니다.

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = new LinkedList<>(list1);

 


 

2. 고정 크기 리스트 (Fixed-size List)

Arrays.asList를 사용하면 고정 크기의 리스트가 생성됩니다.
이 리스트는 값 수정은 가능하지만, 추가/삭제는 불가능합니다.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.set(0, 6); // 가능
list.add(6);    // 오류 발생!
list.remove(0); // 오류 발생!

 


 

3. 리스트를 배열로 변환하기

배열에 값 복사하기

리스트의 값을 하나씩 배열에 복사합니다.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] arr = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);
}

toArray를 사용하기

리스트를 배열로 간단히 변환할 수 있습니다.

List<String> list = Arrays.asList("A", "B", "C");
String[] arr = list.toArray(String[]::new);

stream을 사용하기

Stream을 활용하여 배열로 변환합니다.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

 


 

4. 리스트 요소 삭제 시 주의사항

List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
int size = list.size();
for (int i = 0; i < size; i++) {
    list.remove(0); // 모든 요소가 정상적으로 삭제됨
}

삭제 시 발생하는 문제

리스트를 반복문으로 탐색하며 삭제하면 인덱스가 꼬여 예상대로 동작하지 않을 수 있습니다.

List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
for (int i = 0; i < list.size(); i++) {
    list.remove(i); // 인덱스 변화로 일부 요소가 삭제되지 않음
}

해결 방법

  • 0번째 요소만 삭제: 리스트 크기를 고정한 반복문 사용

 


 

5. Immutable List 만들기

Immutable 리스트의 필요성

함수에 리스트를 전달할 때, 원본 리스트가 수정되지 않도록 보호해야 할 경우가 있습니다.
Collections.unmodifiableList를 사용하면 리스트를 변경 불가능한 형태로 만들 수 있습니다.

List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
updateList(Collections.unmodifiableList(list));
System.out.println(list); // 원본 리스트는 수정되지 않음

변경 불가능한 리스트 생성

void updateList(final List<Integer> list) {
    list.set(0, 10); // Error: UnsupportedOperationException 발생
}

 


 

핵심 정리

  • 리스트 생성: Arrays.asList, 배열 기반, 기존 리스트 복제
  • 고정 크기 리스트: 값 변경 가능, 크기 변경 불가능
  • 리스트 → 배열: toArray, stream을 활용
  • 삭제 주의사항: 인덱스 관리에 유의
  • Immutable 리스트: Collections.unmodifiableList로 원본 보호

 


 

⚠️ 꼭 기억해야 할 핵심 내용

리스트 → 배열 변환 시 Stream 활용

Stream을 사용하여 리스트를 배열로 변환하는 방법은 특히 primitive 타입에 유용합니다.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

리스트 삭제 시 주의점: 인덱스 문제 해결

리스트 삭제 시 반복문을 사용할 때는 리스트 크기를 미리 고정한 후 0번째 요소만 삭제하면 문제가 발생하지 않습니다.

List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
int size = list.size();
for (int i = 0; i < size; i++) {
    list.remove(0); // 모든 요소가 정상적으로 삭제됨
}

 

'백엔드 > JAVA' 카테고리의 다른 글

[JAVA] Arrays.sort와 Compator  (1) 2025.01.03
[Java] 맵(Map)  (0) 2024.12.04
[JAVA] Stream API  (0) 2024.12.01
[JAVA] 자료구조와 알고리즘  (0) 2024.11.26