자바 Arrays.asList

2023. 11. 5. 19:56java

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

해당 코드를 보면 위와 같다. 반환형이 ArrayList인데 우리가 생각하는 java.util.ArrayList가 아니다.

 java.util.Arrays.ArrayList이다.

 

하지만 여러 코드를 살펴보면 초기화를 위해 아래와 같이 사용된다.

ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(1,2,3));

 

 check point

1. new 연산자를 왜 사용하는가?

return으로 반환되는 ArrayList는 클래스만 변경되는 wraper 이다.

String[] stringArray = new String[] { "A", "B", "C", "D" };
List stringList = Arrays.asList(stringArray);

해당 예제에서 stringList의 값을 변경하면?

얕은 복사처럼 stringArray의 값이 같이 바뀐다.

 

해당 예제에서 stringList의 값을 추가하면?

해당 동작을 지원하지 않는다는 오류를 받게된다.

    public ArrayList(Collection<? extends E> c) {
        Object[] a = c.toArray();
        if ((size = a.length) != 0) {
            if (c.getClass() == ArrayList.class) {
                elementData = a;
            } else {
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        } else {
            // replace with empty array.
            elementData = EMPTY_ELEMENTDATA;
        }
    }

 

해당 코드는 자바 util의 ArrayList의 생성자이고 Collection<? extends E>는 E타입이거나 E의 하위 타입들을 포함하는 Collection 타입을 의미한다. 따라서 wrapper로 클래스가 변경된 Array가 매개변수로 들어갈 수 있게된다.

 

2. 왜 List로 가져오는가?

해당 부분은 다형성과 관련된 부분으로 ArrayList가 아니라 List로 받으면 추후 개발과정에서 List를 ArrayList , 혹은 LinkedList로 쉽게 변경할 수 있다. why? 개발 과정에서 List라고 생각하고 코드를 짤거니까 해당 인터페이스를 상속받는 ArrayList , 혹은 LinkedList 에서도 쉽게 호환이 된다.

'java' 카테고리의 다른 글

stream 문법  (0) 2023.11.05
함수형 프로그래밍 , 람다식  (0) 2023.11.05
자바 String Literal, String Object? immutable?  (0) 2023.11.05
자바 심화 체크리스트  (0) 2023.11.05
자바 collection 개념  (0) 2023.11.05