[JAVA] Arrays.asList()
java.util.Arrays에는 배열을 조작하기 위한 static method들이 모여 있다.
그 중에 배열을 List로 바꾸는데 편리하게 사용할 수 있는 Arrays.asList() 메소드가 존재한다.
List<Integer> list = Arrays.asList(1, 2, 3);
하지만 일반적인 list와는 큰 차이가 있다. 그것은 일반적인 list처럼 데이터를 추가하거나 삭제할 때 확인할 수 있었다.
List<Integer> list = Arrays.asList(1, 2, 3);
list.add(4);
위와 같이 UnsupportedOperationException 예외를 던지는 것을 확인 할 수 있다. 해다 예외는 요청이 지원되지 않을 때 던지는 예외이다.
그렇다면 왜 Arrays.asList로 생성한 list는 add와 같이 요소를 추가하거나 삭제하는 연산을 지원하지 않는 것인지 찾아보았다.
사실 asList에 return하는 List는 java.util안에 있는 List가 아니다. 바로 Arrays에 static class로 선언된 ArrayList이다.
Arrays에 ArrayList에서는 지정된 배열의 고정된 목록을 반환한다. 또한 원본 배열을 그대로 본떠 만든 list이기 때문에 원본이 훼손될 수 있는 요소가 추가되거나 삭제되는 행위는 지원하지 않는다.
Integer[] array = {1, 2, 3};
List<Integer> list = Arrays.asList(array);
System.out.println(list);
array[0] = 4;
array[1] = 5;
System.out.println(list);
배열의 값을 수정했지만 Arrays.asList로 생성한 list를 출력하면 값이 변경된 것을 확인할 수 있다. Arrays.asList는 단순히 원본 배열을 좀 더 편리하게 조작하기 위한 용도이지 새롭게 요소를 추가하거나 삭제하기 위한 용도는 아니다.
그렇다면 새롭게 list를 생성하기 위해선 어떻게 해야 하는지 찾아보았다.
java.utill.ArrayList에 Collection 타입을 인자로 받는 생성자를 사용하여 생성해야 한다. 위 생성자를 활용하여 생성하면 원본 배열과 주소값이 완전히 다른 새로운 list로 생성할 수 있다.
Integer[] array = {1, 2, 3};
// List<Integer> list = Arrays.asList(array);
List<Integer> list = new ArrayList<>(Arrays.asList(array));
System.out.println(list);
array[0] = 4;
array[1] = 5;
System.out.println(list);
또 다른 방법으로는 addAll() 메소드를 사용하는 것이다.
Integer[] array = {1, 2, 3};
List<Integer> list = new ArrayList<>();
list.addAll(Arrays.asList(array));
System.out.println(list);
array[0] = 4;
array[1] = 5;
System.out.println(list);
동일한 결과를 확인할 수 있었고, 원본 배열을 수정하여도 전혀 지장을 안주는 것을 확인할 수 있었다. 이제 일반적인 list 처럼 add, remove등 자유롭게 사용이 가능하다!