자바 Arrays.asList
2023. 11. 5. 19:56ㆍjava
@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 |