자바 프로그래밍을 하며 리스트로 반환을 하고싶은데 어떤 방식으로 해야할지 몰라 찾다가 List.of()에 대해 알게 되었고, 최근에 정적 팩토리 메서드에 대해 알아봤었는데, List.of()도 정적 팩토리 메서드라길래 더 관심이 갔다.
public static void main(String[] args) {
// 생성자 방식
List<Number> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
// Arrays 클래스의 asList 메서드
List<Number> asList = Arrays.asList(1, 2, 3);
// List 인터페이스의 of 메서드 (jdk 9)
List<Number> listOf = List.of(1, 2, 3);
}
Arrays.asList() 는 배열을 리스트로 변환하는 메서드이고,
List.of() 는 자바9 부터 지원하는 List 인터페이스의 메서드인 정적 팩토리 메서드이다.
둘의 차이점을 알아보자.
변경 가능 여부 (Mutable / Immutable)
Arrays.asList()로 반환된 list는 변경이 가능하다. 하지만, List.of()에서 반환된 메서드는 변경이 불가능하다.
List<Integer> list = Arrays.asList(1, 2, null);
list.set(1, 10); // OK
List<Integer> list = List.of(1, 2, 3);
list.set(1, 10); // Fails with UnsupportedOperationException
이유는 Arrays.asList()는 ArrayList를 반환하고, set등이 구현되었습니다. (Arrays 내부 클래스 ArrayList)
반면, List.of()는 ListN이라는 타입의 객체를 반환하는데, 이는 불변 객체(Immutable object)입니다. 따라서 수정할 수 없습니다.
=> 모두 크기는 변경할 수 없지만, 바꾸려면 Collections을 생성해서 요소의 값을 옮겨야 한다.
Null 허용 여부
Array.asList()는 null을 허용합니다. List.of()는 반환 객체가 생성될 때, 내부적으로 파라미터들에 대한 null체크를 하고 null을 허용하지 않습니다.
List<Integer> list = Arrays.asList(1, 2, null); // OK
List<Integer> list = List.of(1, 2, null); // Fails with NullPointerException
참조 / 비참조
Arrays.asList(array)는 참조를 사용하기 때문에 배열의 값이 변경되면 list에도 영향이 갑니다.
Integer[] array = {1,2};
List<Integer> list = Arrays.asList(array);
array[0] = 100;
System.out.println(list); // [100, 2]
List.of(array)의 결과는 값을 기반으로 독립적인 객체를 만들기 때문에 참조가 일어나지 않습니다.
Integer[] array = {1,2};
List<Integer> list = List.of(array);
array[0] = 100;
System.out.println(list); // [1, 2]
메모리 사용
Arrays.asList()는 List.of()보다 힙에 더 많은 개체를 생성하기 때문에 더 많은 오버헤드 공간을 차지합니다. 따라서, 단지 값 요소가 필요한 경우라면 List.of()가 적합합니다
정리
Array.asList | List.of | |
삽입 (add), 삭제 (remove) | 불가능 | 불가능 |
변경 (set, replace) | 가능 | 불가능 |
Null 허용여부 | 허용X | 허용X |
각 원소에 대한 Null 허용여부 | 허용 | 허용X |
메모리 사용 | 더 큰 오버헤드 | 더 적음 |
References
https://jaehoney.tistory.com/144
https://kim-jong-hyun.tistory.com/31
'😀Language > Java' 카테고리의 다른 글
[Test] contains를 이용한 테스트 (0) | 2024.10.27 |
---|---|
정적 팩토리 메서드(Static Factory Method)란? (2) | 2024.10.03 |
Optional<T> isPresent(), ifPresent(), orElseThrow (0) | 2024.03.14 |
[Optional이란?] (0) | 2024.03.14 |
[람다와 스트림] (0) | 2024.03.14 |