[Java] 배열<-> List 변환하기

유수종·2025년 5월 10일

프로그래머스로 코딩테스트를 하다보면 종종 input 값으로 배열을 받는 경우가 있다.

배열은 길이가 정해져있고 원소값을 자유롭게 더하고 빼기 어렵다는 단점이 있기 때문에 특정 원소값을 빼거나 추가하는 문제에서는 리스트로 변환이 필요하다.

for문을 이용한 간단한 방법

import java.util.*;

int[] arr = {1, 2, 3, 4, 5};
ArrayList<Integer> list = new ArrayList<>(); 

for (int i : arr) {
	list.add(i);
}

리스트를 만들고 for문으로 기존 배열을 순회하며 모든 원소를 list에 추가해주는 방법이 있다.
(조금 없어보이지만 밑에 단점들을 보면 이 방법이 제일 좋다..)

Arrays를 이용한 방법

여기서는 두가지 케이스에 따라 방법이 나뉜다.

  • 기존 배열의 타입이 기본형(primitive)일 경우
  • 기존 배열의 타입이 래퍼 클래스(wrapper class)일 경우

Wrapper Class 배열 <-> List

배열 -> 리스트

Wrapper 클래스인 배열은 asList() 메소드로 간단하게 변환 가능하다.

import java.util.*;

String[] strArr = {"a", "b", "cd"};
List<String> newArr = Arrays.asList(strArr);
리스트 -> 배열
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
// 방법1
String[] arr=list.toArray(String[]::new);
// 방법2
String[] arr2=list.toArray(new String[list.size()]);

리스트의 배열화는 toArray() 메소드를 사용하는데 안에 new 생성자 함수로 빈 배열을 넣어준다.
두가지 방법이 있는데 첫번째 방법처럼 사용하면 list의 크기를 알아서 추론해준다.

기본형 배열 <-> List

배열 -> 리스트

이번 내용에서 가장 중요한 부분이다. List는 래퍼클래스 타입만 담을 수 있기 때문에 기본형 배열을 List로 변환할 경우 모든 내용물을 변환해줘야 한다.

import java.util.*;
import java.util.stream.*; // Collectors

int[] arr = {1, 2, 3, 4, 5};
List<Integer> list = Arrays
			.stream(arr) // ->IntStream
			.boxed() // ->Stream<Integer>
			.collect(Collectors.toList()); // 담기

stream의 boxed()는 IntStream과 같은 원시타입 스트림을 Stream<Integer>와 같이 래퍼클래스 스트림으로 변환해준다. (Collectors에 담기 위함)

리스트 -> 배열
// 리스트
List<Integer> list = IntStream.range(1, 6)
                .boxed()
                .collect(Collectors.toList());
// Integer 배열로 변환
Integer[] arr = list.toArray(Integer[]::new);
// int형 배열로 변환
int[] arr2 = list.stream()
			.mapToInt(i->i).toArray();

Integer 배열을 int 배열로 변환할때는 mapToInt() 메소드로 하나씩 꺼내서 그대로 반환해주면 int형으로 변환해준다.

주의사항

List<Integer> list1 = Arrays.asList(arr);
List<Integer> list2 = List.of(arr); //java9에 추가됨

asList() 또는 List.of()로 변환된 리스트는 크기가 고정되에 추가 삭제가 안된다!...

따라서 동적으로 관리하려면 아래와 같이 생성자로 새로운 리스트를 만들어서 담아주어야한다.

List<Integer> notFixedList 
= new ArrayList<Integer>(Arrays.asList(arr));;

0개의 댓글