어제 오늘 내일

[Java] 배열을 List로, List를 배열로 변환하기 본문

IT/Java

[Java] 배열을 List로, List를 배열로 변환하기

hi.anna 2021. 5. 2. 15:53

배열을 List로

  1. Arrays.asList()
  2. new ArrayList<>(Arrays.asList())
  3. Collectors.toList()

 

ArrayList를 배열로

  1. toArray() - java.util.List

 

배열을 List로

1. Arrays.asList()

  코드  

import java.util.Arrays;
import java.util.List;

public class ArrayConversion {
    public static void main(String[] args) {
        String[] arr = { "A", "B", "C" };

        // 배열 -> List로 변환
        List<String> list = Arrays.asList(arr);

        System.out.println(list.get(0)); // "A"
        System.out.println(list.get(1)); // "B"
        System.out.println(list.get(2)); // "C"
    }
}

 결과 

A
B
C

java.util.Arrays 클래스의 asList() 메소드를 이용하여

배열을 List로 변환하였습니다.

 

 

2. new ArrayList<>(Arrays.asList())

1번 예제처럼 Arrays.asList()  메소드를 사용하여 간단하게 배열을 List로 변환할 수 있지만 몇가지 주의해야 할 것이 있습니다.

Arrays.asList() 메소드는 고정길이(fixed-size)의 원배열(specified array)의 list view를 리턴합니다.

즉, 고정길이의 원래 배열의 list view를 리턴하기 때문에

Arrays.asList()를 사용해서 배열을 List로 변환한 후, 길이를 List에 값을 추가하는 것이 불가능하고,

원래 배열의 값을 변경하면 List의 값도 같이 변경됩니다.

 

 2.1 Arrays.asList() 실행 후, 배열 값이 변경된 경우 

  코드  

import java.util.Arrays;
import java.util.List;

public class ArrayConversion {
    public static void main(String[] args) {
        String[] arr = { "A", "B", "C" };

        // 배열 -> List로 변환
        List<String> list = Arrays.asList(arr);

        // arr 배열 값 변경
        arr[0] = "D";

        System.out.println(list.get(0)); // "D"
        System.out.println(list.get(1)); // "B"
        System.out.println(list.get(2)); // "C"
    }
}

 결과 

D
B
C

위 코드는 Arrays.asList() 메소드로 배열을 List로 변경 한 후,

arr[0] 값을 변경한 후, List의 값을 출력하였습니다.

List를 직접 변경하지 않았지만, 원본 배열의 값이 변경되면서, List의 값도 같이 변경된 것을 확인할 수 있습니다.

 

 2.2 Arrays.asList() 실행 후, List 값이 변경된 경우 

  코드  

import java.util.Arrays;
import java.util.List;

public class ArrayConversion {
    public static void main(String[] args) {
        String[] arr = { "A", "B", "C" };

        // 배열 -> List로 변환
        List<String> list = Arrays.asList(arr);

        // list 값 변경
        list.set(0, "D");

        System.out.println(Arrays.toString(arr)); // ["D", "B", "C"]

        System.out.println(list.get(0)); // D
        System.out.println(list.get(1)); // B
        System.out.println(list.get(2)); // C
    }
}

 결과 

[D, B, C]
D
B
C

이번 코드에서는, Arrays.asList() 메소드로, 배열을 List로 변경한 후,

List의 값을 변경해보았습니다.

위의 예제(Arrays.asList() 실행 후, 배열 값이 변경된 경우)와 마찬가지로,

List의 값도 변경되고, 원본 배열의 값도 변경된 것을 확인할 수 있습니다.

 

 2.3 Arrays.asList() 실행 후, List에 값이 추가된 경우(List의 길이가 변경 됨) 

  코드  

import java.util.Arrays;
import java.util.List;

public class ArrayConversion {
    public static void main(String[] args) {
        String[] arr = { "A", "B", "C" };

        // 배열 -> List로 변환
        List<String> list = Arrays.asList(arr);

        // list에 값 추가
        list.add("D");

        System.out.println(list.get(0));
        System.out.println(list.get(1));
        System.out.println(list.get(2));
        System.out.println(list.get(3));
    }
}

 결과 

Exception in thread "main" java.lang.UnsupportedOperationException
        at java.base/java.util.AbstractList.add(AbstractList.java:153)   
        at java.base/java.util.AbstractList.add(AbstractList.java:111)   
        at ArrayConversion.main(ArrayConversion.java:12)

위 코드에서는 Arrays.asList() 메소드를 사용하여, 배열을 List로 변경한 후,

List에 원소를 추가하였습니다.

Arrays.asList()는 고정길이의 List를 리턴하기 때문에,

새로운 값을 추가한 경우 위와 같이 Exception이 발생합니다.

 

 2.4 new ArrayList<>(Arrays.asList()) 

이렇게 원본 배열의 값과 변환 된 List의 값이 동기화 되는 것을 막기 위해서

Arrays.asList()로 변환한 List로 새로운 ArrayList 객체를 생성해서 사용할 수 있습니다.

 

  코드  

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

public class ArrayConversion {

    public static void main(String[] args) {
        String[] arr = { "A", "B", "C" };

        // 배열 -> List로 변환
        List<String> list = new ArrayList<>(Arrays.asList(arr));

        // arr 배열 값 변경
        arr[0] = "0";

        // list에 값 추가
        list.add("D");

        System.out.println(list.get(0));  // A
        System.out.println(list.get(1));  // B
        System.out.println(list.get(2));  // C
        System.out.println(list.get(3));  // D
    }
}

 결과 

A
B
C
D

위 코드에서는 Arrays.asList()로 배열을 List로 변환한 결과를 

ArrayList의 생성자로 전달하여, 새로운 ArrayList를 생성하였습니다.

그 결과,

원본 배열의 값을 변경하여도, list의 값이 변경되지 않고,

list에 새로운 값을 추가하여 길이를 변경시키는 것도 가능하게 되었습니다.

 

 

3. Collectors.toList()

Java 8 버전 이후부터는, Stream을 이용하여 배열을 List로 변환할 수도 있습니다.

  코드  

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ArrayConversion {
    public static void main(String[] args) {
        String[] arr = { "A", "B", "C" };

        // 배열 -> List로 변환
        List<String> list = Stream.of(arr).collect(Collectors.toList());

        System.out.println(list.get(0)); // A
        System.out.println(list.get(1)); // B
        System.out.println(list.get(2)); // C
    }
}

 결과 

A
B
C

Stream의 collect()는

데이터를 원하는 타입으로 변경해 줍니다.

위 예제처럼, collect() 메소드에, Collectors.toList()를 전달하면,

배열을 List로 변환할 수 있습니다. 

 

 

 

List를 배열로

1. toArray() - java.util.List

  코드  

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListConversion {
    public static void main(String[] args) {

        // ArrayList 준비
        ArrayList<String> arrList = new ArrayList<String>();
        arrList.add("A");
        arrList.add("B");
        arrList.add("C");

        // ArrayList를 배열로 변환
        int arrListSize = arrList.size();
        String arr[] = arrList.toArray(new String[arrListSize]);

        // 변환된 배열 출력
        System.out.println(Arrays.toString(arr));

    }
}

 결과 

[A, B, C]

 

List를 배열로 변환하기 위해서

java.util.List의 toArray() 메소드를 사용하고, 

파라미터로 변환할 배열의 타입과 같은 객체를 생성하여 넣어주었습니다.

(여기서는 new String[arrListSize])

 

위 예제에서는 toArray()의 파라미터로 배열 객체를 만들어서 넘길 때,

정확한 배열의 길이를 지정(arrListSize)하여 넘겨주었지만,

아래와 같이, 배열의 길이를 '0'으로 해 주어도 됩니다.

arrList.toArray(new String[0]);
arrList.toArray(new String[arrListSize])

java.util.List의 toArray()  메소드는

파라미터로 전달받은 배열 객체의 길이가, 원본 리스트보다 작을 경우

자동으로 원본 리스트의 size 크기로 배열을 만들어줍니다.

반대로, 원본 List의 길이보다 배열의 크기를 더 크게 지정하면,

배열의 나머지 인덱스는 'null'로 채워집니다.

 


 

그런데, int 배열과 같은 Primitive 타입의 배열의 경우,

위와 같은 방법으로는 List로 변환할 수 없습니다.

int 배열(Primitive Type)의 List 변환 방법은 다음 포스팅을 참조하세요.

[Java] int 배열을 List로 변환하기

 

[Java] int 배열을 List로 변환하기

지난번에는 배열을 List로 변환하는 방법을 알아보았습니다. [Java] 배열을 List로, List를 배열로 변환하기 (Arrays.asList()) Collectors.toList() ArrayList를 배열로 toArray() - java.util.List 배열을 List..

hianna.tistory.com

Java에서 배열을 ArrayList로, ArrayList를 배열로 변환하는 방법을 알아보았습니다.

 

 

반응형
Comments