백앤드 개발일지/자바

new ArrayList<>()와 Arrays.asList()와 List.of()

giron 2022. 3. 13. 15:28
728x90

자바를 사용하다보면 List를 만드는데 여러가지 방법들을 사용해왔었다. 그 차이를 모르고 손에 익히는대로 사용했는데 이번에 정리를 하려고 한다.

 

import java.util.ArrayList; // new ArrayList<>()
import java.util.Arrays; // Arrays.asList()
import java.util.List;	// List.of()

차이점

 1. 원소를 추가/삭제할 수 있나?

  원소를 추가/삭제 set 사용 가능
new ArrayList<>() 가능 가능
Arrays.asList() 불가능 가능
List.of() 불가능 불가능

 

add방법

ArrayList<>()에 List값을 하나만 넣으려면 List.of()를 감싸서 넣으면 된다. 그렇지 않고 List.of()로 한 후 add를 하면 아래처럼 UnsupportedOperationException이 뜬다.

불가능은 전부 UnsupportedOperation이 뜬다.

여기서 궁금한 건 List.of()로 선언해도 add매서드를 사용할수는 있다. (컴파일 에러 발생 x)

경고만 해준다.

지원은 해주는데 왜 하면 안되는지 궁금해서 확인해 보았는데

모든 mutating 매서드는 UnSupported~Exception을 던진다고 한다.

 즉 변경이 생기면 에러를 던진다고 생각했다.

2. null을 가질수 있는가?

new ArrayList<>()는 null을 가질 수 있다.

Arrays.asList()는 null을 가질 수 있다.

List.of()는 null을 가질 수 없다.

3. 불변

List.of()는 참조한 원본 배열의 값이 바뀌어도 List의 값은 바뀌지 않는다.

Arrays.asList()는 참조한 원본 배열의 값이 바뀌면 List의 값도 바뀌고, List의 값이 바뀌면 원본 배열의 값도 바뀐다.

마무리

테스트 코드에서 배열의 size가 변하면 안 되거나 변할 필요가 없을 때 List.of()를 사용한다.

그런데 null값을 테스트 해야한다면 Arrays.asList()를 사용한다.

 

그 외 프로덕션 코드에서는 new ArrayList<>()를 사용하여 컬렉션 생성 시, 새로운 주소값으로 할당하여 의도치 않는 변화를 막는다.(방어적 복사)

 

Reference

 

new ArrayList<>() vs Arrays.asList()

List를 만들때 대부분은 와 를 사용하여 만든다. 그럼 와 의 차이를 알고 사용하고 있는가? 이번 글에서는 두개의 차이점을 알아볼 것이다. 1. return type 와 는 다른 클래스다. 는 ArrayList를 는 Arrays

tecoble.techcourse.co.kr

 

728x90