우테코 미션을 수행하다가 배열을 List화 시켜야 하는 상황을 자주 마주했다.
그럴 때, 우리는 두 가지 대안을 고려해볼 수 있는데 Arrays.asList()와 List.of()가 그것이다.
public class HelloApplication {
public static void main(String[] args) {
List<String> asList = Arrays.asList("1", "2", "3");
List<String> listOf = List.of("1", "2", "3");
System.out.println(asList);
System.out.println(listOf);
}
}
두 메소드는 모두 List를 생성하는 기능을 수행하며,
각 원소를 인자로 받는다는 점에도 유사하다
그렇다면 어떤 차이가 있을까?
이 점이 궁금해 찾아보다가 김종현님의 블로그에서 나름 심층깊은 탐구를 발견하여 정리해보고자 했다.
그렇다면 List.of()와 Arrays.asList()는 어떤 차이가 있는 것일까?
Arrays.asList()
asList()가 선언된 파일을 찾아보면
반환하는 ArrayList는 java.util.ArrayList가 아니라 내부클래스 ArrayList이다.
이 내부 클래스는 다음과 같은 특성을 가진다.
1. 내부 클래스 ArrayList 구조는 배열로 이루어져 있다.
2. 인자들은 nonNull이어야 한다.
3. 오버라이딩
- set()을 오버라이딩 했다. => 갱신 가능
- remove()와 add()는 오버라이딩 하지 않았다. => 삭제/추가 불가능
이를 더 살펴보기 위해 Arrays.asList()에서 반환하는
내부에 구현된 ArrayList가 상속한 AbstractList<E>를 살펴보자
add와 remove()를 보면 UnsupportedOperationException과 관련된 설명이 있다.
이는 서브 클래스에서 해당 메서드를 오버라이딩하지 않은 상태로 사용하면
다음 예외가 발생한다는 것을 의미한다.
그리고 Arrays 안에서 구현된 내부클래스 ArrayList에는
add와 remove가 오버라이딩 되어 있지 않다.
즉 Arrays.asList로 반환되는 배열은
삽입 삭제가 불가하다.
그러나 set은 오버라이딩되어 있으므로
값을 변경하는 건 가능하다.
결론 :
Arrays.asList = 값 갱신 가능 but, 삽입/삭제 불가능
List.of()
이번엔 List.of()를 보자
1.ImmutableCollections를 반환한다.
=> List.of()로 리턴되는 List는 불변하다고 유추가능하다
그럼 ImmutableCollection이 상속하는 AbstractImmutableList를 살펴보자
=> add(), remove(), set(), replace() 등을 모두 하지 못한다고 쓰여져 있다.
@jdk.internal.ValueBased
static abstract class AbstractImmutableCollection<E> extends AbstractCollection<E> {
// all mutating methods throw UnsupportedOperationException
@Override public boolean add(E e) { throw uoe(); }
@Override public boolean addAll(Collection<? extends E> c) { throw uoe(); }
@Override public void clear() { throw uoe(); }
@Override public boolean remove(Object o) { throw uoe(); }
@Override public boolean removeAll(Collection<?> c) { throw uoe(); }
@Override public boolean removeIf(Predicate<? super E> filter) { throw uoe(); }
@Override public boolean retainAll(Collection<?> c) { throw uoe(); }
}
즉, List.of로 반환되는 리스트는 갱신까지 불가한 불변 리스트이다.
2. Null 체크
=> 생성자로 들어오는 값들을 null체크하며 Null값이 오면 NPE가 발생한다
결론
: List.of로 반환되는 리스트 = 갱신/삭제/추가 모두 불가능
>> 정리
참고
https://jaehoney.tistory.com/144
'우테코 > Level1' 카테고리의 다른 글
[스크랩] 페어프로그래밍 환경설정 - 공통 커밋 Co-authored-by (0) | 2024.02.23 |
---|---|
[우테코-Lv1] 자동차 경주 간단한 회고 (계속 수정 예정) (0) | 2024.02.22 |
[우테코-Lv1] TDD- AssertJ 라이브러리 (0) | 2024.02.21 |
[Intellij IDEA] 페어 프로그래밍 공유 환경설정 / 같은 IDE 공유하기 (0) | 2024.02.19 |
[스크랩] git 커밋 메시지 타입 (0) | 2024.02.16 |