백앤드 개발일지/자바
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() | 불가능 | 불가능 |
ArrayList<>()에 List값을 하나만 넣으려면 List.of()를 감싸서 넣으면 된다. 그렇지 않고 List.of()로 한 후 add를 하면 아래처럼 UnsupportedOperationException이 뜬다.
여기서 궁금한 건 List.of()로 선언해도 add매서드를 사용할수는 있다. (컴파일 에러 발생 x)
지원은 해주는데 왜 하면 안되는지 궁금해서 확인해 보았는데
즉 변경이 생기면 에러를 던진다고 생각했다.
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
728x90