List를 초기화하는 다양한 방법이 익숙하지 않아서 이에 대해 정리하고자 한다.
List.of()
List 인터페이스의 of 메서드를 활용해 List를 정의하는 방법으로 Java 9부터 활용할 수 있다.
문서를 확인해 보니 아래와 같이 여러 개로 오버로딩 되어있다.
무엇이 다른 것인지 코드를 직접 확인해 보니 인자의 개수에 따라 동작하는 코드가 달랐다.
- 인자가 없는 경우
- 인자가 1개 or 2개인 경우
- 인자가 3개 이상인 경우
- 가변인자 코드
코드가 서로 다르지만 동일하게 ImmutableCollections 클래스를 활용한다.
Immutable가 붙은 것을 보아 변경할 수 없다고을 유추할 수 있는데,
실제로 Immutablecollections 클래스를 찾아보니 List가 아니라 처음 보는 List12와 ListN을 활용하는 것을 확인할 수 있었다.
List12와 ListN를 찾아보니 이들은 ImmutableColleations클래스에 구현된 내부 클래스로
이를 확인해 보면 isEmpty(), size(), get(), indexOf() 등은 구현되어 있지만 set(), remove(), add()는 없다.
즉, 추가, 삭제, 수정을 지원하지 않는다는 것이다.
import java.util.*;
class ListOf {
public static void main(String[] args) {
List<Integer> ofList = List.of(1, 2, 3);
ofList.add(4);
}
}
간단히 add()를 사용해 보니 UnsupportedOperationException이 발생했다. 요청한 작업이 지원되지 않을 때 발생한다.
Arrays.asList()
asList()는 배열을 List에 담아서 반환한다.
코드를 확인해 보니 ArrayList()를 반환하는 것을 알 수 있었다.
하지만 이를 활용해 보니 add()와 remove()를 사용할 수 없었다.(UnsupportedOperationException 발생)
import java.util.*;
class ListOf {
public static void main(String[] args) {
List<Integer> asList = Arrays.asList(1, 2, 3);
asList.add(4);
}
}
ArrayList인데 활용할 수 없는 이유를 확인해 보니 Arrays.asList가 반환하는 ArrayList는 Arrays 클래스의 내부클래스였다.
우리가 흔히 사용하는 ArrayList가 아닌 것이다.
Arrays 클래스의 ArrayList를 확인해 보니 get(), set() 등은 있으나 add(), remove()는 없었다.
따라서 asList()로 반환한 List는 값을 변경할 순 있지만 추가, 삭제가 불가한 것이다.(크기 변경 불가)
만약 asList를 활용하고 크기를 변경하려면 List list = new ArrayList(Arrays.asList(...)); 로 작성해야 한다.
그 이유는 ArrayList는 Collection을 받아 생성할 수 있는데, asList가 반환하는 값이 List이기 때문이다.
- ArrayList 선언 방법 중 하나. Collection을 인자로 받는다.
- Arrays의 asList(). 반환값이 List이다.
Collections.emptyList()
Collections 클래스의 emptyList()도 List를 초기화하는 방법 중 하나이다.
emptyList() 메서드를 확인해 보면 EMPTY_LIST를 반환한다.
EMPTY_LIST는 EmptyList의 객체 상수이다.
그렇다면 EmptyList 클래스를 확인해 보자.
EmptyList 클래스는 Collections 클래스의 내부 클래스로 빈 리스트이다.
코드를 확인해 보면 size()의 반환값이 0, isEmpty()의 반환값이 true로 고정되어 있다.
emptyList() 메서드는 빈 리스트를 보낼 때 활용하며 add()를 활용할 수 없다.
정리
내용을 정리하면 아래와 같다.
List.of | Arrays.asList | Collection.emptyList | |
추가, 삭제 | X | X | X |
변경 | X | O | X |
'Java > Java' 카테고리의 다른 글
Java - Formatter (1) | 2023.10.23 |
---|---|
Java - Google Java Style Guide 정리 (3) | 2023.10.10 |
Java - 생성자, 초기화 블록 (1) | 2023.09.25 |
Java - Java 변수, 메서드 (0) | 2023.09.24 |
Java - enum (0) | 2023.09.22 |