Java/배열

[Java]배열을 리스트로 변환(Array to List)

DevStory 2022. 8. 16.

배열을 리스트로 변환

이번 포스팅은 Java에서 배열을 리스트로 변환하는 다양한 방법들을 소개합니다.

 

고전적인 방법으로 반복문을 사용하거나 Arrays, Collections, Stream 클래스에서 제공하는 메서드를 사용할 수 있습니다.

 

참고로 Stream API를 사용하기 위해서는 Java의 버전이 1.8 이상이어야 합니다.


방법 1. 반복문

Arrays, Collections, Stream 클래스에 대한 이해도가 부족한 경우 반복문을 사용하여 배열의 요소를 리스트에 추가할 수 있습니다.

 

비어있는 List 객체를 생성 후 배열을 순회하면서 배열의 요소를 비어있는 List 객체에 추가합니다.

 

다음 예제는 반복문을 사용하여 Integer 타입의 배열을 Integer 타입의 List로 변환합니다.

public static void main(String args[]) {
  Integer[] intArray = {1, 3, 5, 7, 9};
  List<Integer> intList = new ArrayList<>();

  System.out.println("추가 전");
  System.out.println("intList: " + intList);

  for (Integer num : intArray) {
    intList.add(num);
  }

  System.out.println("\n추가 후");
  System.out.println("intList: " + intList);
}

[실행 결과]

추가 전
intList: []

추가 후
intList: [1, 3, 5, 7, 9]

Integer 타입뿐만 아니라 Double, String 타입 등... 모든 타입의 배열을 List로 변환해야 하는 작업이 필요한 경우 제네릭 타입의 메서드를 정의함으로써 코드의 양을 줄일 수 있습니다.

public static <TSource> List<TSource> convertArrayToList(TSource array[])
{
  List<TSource> list = new ArrayList<>();

  for (TSource t : array) {
    list.add(t);
  }

  return list;
}

public static void main(String args[]) {
  Integer[] intArray = {1, 3, 5, 7, 9};
  List<Integer> intList = convertArrayToList(intArray);
  System.out.println("intList: " + intList);

  String[] strArray = {"A", "AB", "ABC"};
  List<String> strList = convertArrayToList(strArray);
  System.out.println("strList: " + strList);

  Boolean[] boolArray = {true, false, true};
  List<Boolean> boolList = convertArrayToList(boolArray);
  System.out.println("boolList: " + boolList);
}

[실행 결과]

intList: [1, 3, 5, 7, 9]
strList: [A, AB, ABC]
boolList: [true, false, true]

방법 2. Arrays 클래스의 asList 메서드

두 번째 방법으로 Arrays 클래스의 asList() 메서드를 사용합니다.

 

asList() 메서드의 매개변수로 배열을 전달하면, 배열의 요소로 구성된 새로운 정적 클래스인 ArrayList를 반환합니다.

public static void main(String args[]) {
  Integer[] intArray = {1, 3, 5, 7, 9};
  List<Integer> intList = Arrays.asList(intArray);
  System.out.println("intList: " + intList);

  String[] strArray = {"A", "AB", "ABC"};
  List<String> strList = Arrays.asList(strArray);
  System.out.println("strList: " + strList);

  Boolean[] boolArray = {true, false, true};
  List<Boolean> boolList = Arrays.asList(boolArray);
  System.out.println("boolList: " + boolList);
}

[실행 결과]

intList: [1, 3, 5, 7, 9]
strList: [A, AB, ABC]
boolList: [true, false, true]

Arrays 클래스의 asList 메서드의 문제점

주의사항으로 asList() 메서드가 반환하는 ArrayList는 java.util.ArrayList에서 제공하는 ArrayList와 다른 클래스입니다.

 

우리가 알고 있는 ArrayList는 java.util 패키지에 존재하며, Arrays 클래스의 asList() 메서드가 반환하는 클래스는 java.util.Arrays 패키지에 존재합니다.

 

java.util.Arrays 패키지에 존재하는 ArrayList 클래스에는 값을 추가할 수 있는 기능이 없으며, 내부 구조는 배열로 구성되어 있기 때문에 원본 배열을 수정하면 List 객체의 값도 변경되는 문제가 발생합니다.

public static void main(String args[]) {
  Integer[] intArray = {1, 3, 5, 7, 9};
  List<Integer> intList = Arrays.asList(intArray);

  System.out.println("[0번째 요소의 값을 변경하기 전]");
  System.out.println("intArray: " + Arrays.toString(intArray));
  System.out.println("intList: " + intList);

  intArray[0] = 11;

  System.out.println("\n[0번째 요소의 값을 변경 후]");
  System.out.println("intArray: " + Arrays.toString(intArray));
  System.out.println("intList: " + intList);
}

[실행 결과]

[0번째 요소의 값을 변경하기 전]
intArray: [1, 3, 5, 7, 9]
intList: [1, 3, 5, 7, 9]

[0번째 요소의 값을 변경 후]
intArray: [11, 3, 5, 7, 9]
intList: [11, 3, 5, 7, 9]

java.util 패키지에 존재하는 ArrayList를 반환받기 위해서는 ArrayList 생성자 함수의 매개변수에 Arrays 클래스의 asList() 메서드를 전달합니다.

public static void main(String args[]) {
  Integer[] intArray = {1, 3, 5, 7, 9};
  List<Integer> intList = new ArrayList<>(Arrays.asList(intArray));

  System.out.println("[변경 전]");
  System.out.println("intArray: " + Arrays.toString(intArray));
  System.out.println("intList: " + intList);

  intArray[0] = 11;
  intList.add(11);

  System.out.println("\n[변경 후]");
  System.out.println("intArray: " + Arrays.toString(intArray));
  System.out.println("intList: " + intList);
}

[실행 결과]

[변경 전]
intArray: [1, 3, 5, 7, 9]
intList: [1, 3, 5, 7, 9]

[변경 후]
intArray: [11, 3, 5, 7, 9]
intList: [1, 3, 5, 7, 9, 11]

방법 3. Collections 클래스의 addAll() 메서드

세 번째 방법으로 Collections 클래스의 addAll() 메서드를 사용합니다.

 

addAll() 메서드의 첫 번째 매개변수로 비어있는 List 객체를 전달하고 두 번째 매개변수로 배열을 전달합니다.

 

다음 예제를 통해 Collections 클래스의 addAll() 메서드를 호출하는 방법을 확인할 수 있으며, Arrays 클래스의 asList() 메서드와 달리 값을 변경해도 문제가 없습니다.

public static void main(String args[]) {
  Integer[] intArray = {1, 3, 5, 7, 9};
  List<Integer> intList = new ArrayList<>();
  Collections.addAll(intList, intArray);

  System.out.println("[변경 전]");
  System.out.println("intArray: " + Arrays.toString(intArray));
  System.out.println("intList: " + intList);

  intArray[0] = 11;
  intList.add(11);

  System.out.println("\n[변경 후]");
  System.out.println("intArray: " + Arrays.toString(intArray));
  System.out.println("intList: " + intList);
}

[실행 결과]

[변경 전]
intArray: [1, 3, 5, 7, 9]
intList: [1, 3, 5, 7, 9]

[변경 후]
intArray: [11, 3, 5, 7, 9]
intList: [1, 3, 5, 7, 9, 11]

방법 4. Stream API

Java의 버전이 1.8 이상인 경우 Stream API를 사용하여 배열을 List로 변환할 수 있습니다.

 

배열을 스트림으로 변환 후 Collectors.toList() 메서드를 사용하여 스트림을 List로 변환합니다.

public static void main(String args[]) {
  Integer[] intArray = {1, 3, 5, 7, 9};
  List<Integer> intList = Arrays.stream(intArray).collect(Collectors.toList());

  System.out.println("[변경 전]");
  System.out.println("intArray: " + Arrays.toString(intArray));
  System.out.println("intList: " + intList);

  intArray[0] = 11;
  intList.add(11);

  System.out.println("\n[변경 후]");
  System.out.println("intArray: " + Arrays.toString(intArray));
  System.out.println("intList: " + intList);
}

[실행 결과]

[변경 전]
intArray: [1, 3, 5, 7, 9]
intList: [1, 3, 5, 7, 9]

[변경 후]
intArray: [11, 3, 5, 7, 9]
intList: [1, 3, 5, 7, 9, 11]
반응형

댓글