Java - Arrays.asList()

지환·2024년 7월 18일
0

JAVA

목록 보기
40/41

Arrays.asList

List<String> list = Arrays.asList(arr);
  • Arrays.asList() : Arrays의 private 정적 클래스인 ArrayList를 리턴한다.

이 말 뜻을 풀어 해석하면, Arrays 클래스 내부에 ArrayList라는 private 정적 클래스가 있다는 얘기다.

public static <T> List<T> asList(T... a) {
    return new Arrays.ArrayList(a);
}

이런식으로 구성되어있다.

java.util.Arrays.ArrayList 클래스는

  1. set()

  2. get()

  3. contains() 메소드를 가지고 있다. 하지만 대표적인 큰 특징은

원소를 추가하는 메소드는 가지고 있지 않는다.

즉 사이즈를 바꿀 수 없다.

다음 예시를 보자.

public class ArrayListEx1 {
	public static void main(String[] args) {
		/* 지환, 지구, 지태 3명을 담는 String strs 배열 선언 
		*  Arrays.asLlist() < 배열을 담아서 사용해보자.
		*/
		
		String[] strs = {"지환", "지구", "지태"};
		// [지환, 지구, 지태]를 출력해보자.
		System.out.println(Arrays.toString(strs));  // [지환, 지구, 지태]
		
		List<String> jList = Arrays.asList(strs);
		System.out.println(jList); // [지환, 지구, 지태]
		
		strs[0] = "지투";
		
		System.out.println("strs는 변경 되었을까? ==> " + Arrays.toString(strs)); // strs는 변경 되었을까? ==> [지투, 지구, 지태]
		System.out.println("jList는 변경 되었을까? ==> " + jList); // jList는 변경 되었을까? ==> [지투, 지구, 지태]
		
		// 원본 값이 변경됨.
		System.out.println("=======================================");
		// 이번엔 List를 변경해보자.
		
		jList.set(1, "하위");
		
		System.out.println("strs는 변경 되었을까? ==> " + Arrays.toString(strs)); // strs는 변경 되었을까? ==> [지투, 하위, 지태]
		System.out.println("jList는 변경 되었을까? ==> " + jList); // jList는 변경 되었을까? ==> [지투, 하위, 지태]
		
		List<Integer> lsInt = Arrays.asList(22,44,55,11);
		System.out.println(lsInt);
		
	}

}

위 소스를 보면, jList에 담겨있는 인덱스에 데이터를 수정했는데, 원본 배열의 데이터 까지 변경되었다.

List는 내부 구조가 배열로 만들어져 있다. asList()를 사용해서 반환되는 List도 배열을 갖게된다.

이 때, asList()를 사용해서 Lisrt 객체를 만들 때 새로운 배열 객체를 만드는 것이 아니라, 원본 배열의 주소값을 가져오게 된다.

따라서 asList()를 사용해서 내용을 수정하면, 원본 배열도 함께 바뀌게 된다.

이러한 이유 때문에 Arrays.asList()로 만든 List에 새로운 원소를 추가하거나 삭제 할 수 없다.

그렇다면 얕은복사가 아닌, 깊은 복사하려면 어떻게 해야될까?

ArrayList 생성자는 java.util.ArraysList의 상위(super)클래스인 Collection Type도 받을 수 있다.

List<String> list = new ArrayList<String>(Arrays.asList(arr));

이런 식으로 작성하면 된다.

다음 예시를 보자.

public class ArrayListEx2 {

	public static void main(String[] args) {
		String[] jarr = {"지환","지원","지투"};
		List<String> jList = Arrays.asList(jarr);
		List<String> deepList = new ArrayList<>(jList);
		
		//jList.add("D"); //이렇게 한다면, UnsupportedOperationException 발생
		
		deepList.add("new Add");
		System.out.println(deepList); // [지환, 지원, 지투, new Add]
		

		
	}
}

profile
아는만큼보인다.

0개의 댓글

관련 채용 정보