본문 바로가기
Java/Java이론

List와 배열 간의 상호 변환

by P_eli 2024. 11. 4.
728x90
반응형

프로그래밍에서 배열(Array)과 리스트(List)는 매우 자주 사용되는 데이터 구조입니다. 배열은 고정된 크기를 가지며 메모리 효율성이 뛰어난 반면, 리스트는 크기가 동적으로 변할 수 있어 사용하기에 더 유연합니다. 이 두 자료구조는 상황에 따라 서로 변환이 필요할 수 있으며, 이러한 변환을 효율적으로 수행하는 방법에 대해 알아보겠습니다.

 

1. 배열을 리스트로 변환하기: Arrays.asList()

배열을 리스트로 변환할 때 자주 사용되는 메서드는 Arrays.asList()입니다. 이 메서드는 간단히 배열을 리스트로 바꾸지만, 몇 가지 주의점이 있습니다.

기본 사용법

String[] array = {"Java", "Python", "C++"};
List<String> list = Arrays.asList(array);
System.out.println(list); // [Java, Python, C++]

 

주의할 점

  • 고정된 크기: Arrays.asList()는 내부적으로 배열을 감싼 리스트를 반환합니다. 따라서 이 리스트는 크기를 변경할 수 없습니다. 즉, 요소를 추가하거나 삭제할 수 없습니다.
  • UnsupportedOperationException: 리스트에 add()나 remove() 같은 메서드를 호출하면 UnsupportedOperationException이 발생합니다.
list.add("JavaScript"); // 예외 발생: UnsupportedOperationException

 

해결책

리스트의 크기를 변경할 필요가 있다면, new ArrayList<>(Arrays.asList(array))를 사용해 ArrayList를 생성할 수 있습니다.

List<String> modifiableList = new ArrayList<>(Arrays.asList(array));
modifiableList.add("JavaScript");
System.out.println(modifiableList); // [Java, Python, C++, JavaScript]

 

 

 

2. 리스트를 배열로 변환하기: List.toArray()

리스트를 배열로 변환하는 가장 일반적인 방법은 List.toArray() 메서드를 사용하는 것입니다. 이 메서드에는 두 가지 주요 사용법이 있습니다.

기본 사용법

List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");

// Object 타입의 배열 반환
Object[] array = list.toArray();
System.out.println(Arrays.toString(array)); // [Java, Python, C++]

 

타입 명시적 변환

toArray()에 타입을 명시적으로 전달하면 더 안전하게 원하는 타입의 배열을 생성할 수 있습니다.

String[] stringArray = list.toArray(new String[0]);
System.out.println(Arrays.toString(stringArray)); // [Java, Python, C++]

주의할 점

  • 제네릭 타입 안전성: toArray(new String[0]) 방식은 타입 안정성을 보장하며, 런타임 시 타입 변환 예외를 방지할 수 있습니다.

 

3. 성능 및 메모리 비교

배열과 리스트 변환 시 성능과 메모리 사용의 차이를 이해하는 것도 중요합니다.

성능

  • 배열을 리스트로 변환: Arrays.asList()는 배열을 그대로 감싸는 가벼운 래퍼를 반환하므로 매우 빠릅니다. 리스트의 원본 배열을 참조하기 때문에 추가 메모리 할당이 필요하지 않습니다.
  • 리스트를 배열로 변환: List.toArray()는 새 배열을 생성하므로 변환 시 추가 메모리가 사용됩니다. 특히 대규모 데이터 구조에서는 메모리 사용량에 주의해야 합니다.

메모리 사용

  • **Arrays.asList()**는 기존 배열을 그대로 사용하므로 메모리 사용량이 증가하지 않습니다. 그러나 원본 배열의 변경은 리스트에도 영향을 줍니다.
  • **List.toArray()**는 새로운 배열을 생성하기 때문에 메모리 사용량이 증가할 수 있습니다. 큰 리스트의 경우, 메모리 효율을 고려해 변환해야 합니다.

4. 변환의 실제 사례와 팁

리스트를 배열로 변환하는 이유

리스트를 배열로 변환하는 것은 종종 다른 API나 레거시 코드가 배열을 필요로 할 때 유용합니다. 예를 들어, 자바의 고전적인 I/O 또는 그래픽 라이브러리에서 배열을 사용해야 하는 경우가 있습니다.

성능 팁

  • 데이터의 크기가 크고 변환이 자주 발생하는 경우, 배열과 리스트 간 변환의 메모리와 성능을 프로파일링해 최적화를 검토하세요.
  • 리스트를 배열로 변환할 때 항상 필요한 최소한의 크기의 배열을 전달하는 것이 좋습니다.
Integer[] numbers = list.toArray(new Integer[list.size()]);

 

이 방식은 배열의 정확한 크기로 변환되어, new String[0]처럼 런타임 시 최적화된 크기의 배열을 생성하는 경우보다 더 효율적일 수 있습니다.

 

정리

배열과 리스트 간의 상호 변환은 자바 개발자에게 있어 필수적인 작업입니다. 적절한 방법을 선택하고 주의점을 염두에 둔다면 코드의 유연성과 성능을 모두 확보할 수 있습니다.

728x90
반응형