티스토리 뷰

JAVA에서 List를 만들때 ArrayListLinkedList와 같은 List 인터페이스를 구현한 구현체의 객체를 생성할 수 있는데 이번글에는 Arrays.asList()List.of() 메소드로도 생성할 수 있습니다. 오늘은 이 2개의 차이에 대해 한번 알아보겠습니다.

List 생성하기

Arrays.asList()와 List.of()로 각각 List를 생성하였습니다.

 

Arrays.asList()

Arrays.asList()의 리턴값은 java.util.ArrayList이 아닌 Arrays 클래스의 내부클래스 ArrayList입니다.
asList() 메서드 시그니처를 확인해보면 가변인자를 받게끔 되있고 4323 Line을 확인해보면 ArraysList(Arrays 내부) 클래스의 구조는 배열로 이루어진걸 확인할 수 있습니다.
4326 Line부터 4410 Line엔 AbstractList 추상클래스의 메서드를 오버라이딩한 목록이 있는데.  그중에 add()remove()는 오버라이딩을 하지않고 set()은 오버라이딩한걸 확인할 수 있습니다.



AbstractList의 add()remove() 메서드를 확인해본 결과 서브클래스에서 해당 메서드를 오버라이딩 하지 않으면
UnsupportedOperationException 예외가 발생됩니다.


Arrays.asList()에 의해 생성되는 ArrayList는 삽입, 삭제로 이뤄지는 구조적인 변경을 허용하지 않고 내부 원소들의
값을 변경하는건 허용하는걸 알 수 있습니다.

 

List.of()

List.of() 메서드는 JAVA 9 부터 지원하는 메서드입니다. 인자값이 하나 또는 두개를 받는 List와 세개 이상을 받는 List가 다른 데 직접 확인해보도록 하겠습니다.



List 이름에서도 알 수 있다시피 List12는 리스트 원소가 1개 또는 2개만을 관리하고, ListN은 N개의 리스트를 관리하는걸 알 수 있고 그 목적에 맞게 메서드가 오버라이딩 된 걸 확인할 수 있습니다.

AbstractImmutableList라는 추상클래스를 상속받은걸로 보아 List.of() 메서드에 리턴되는 List는 불변하다는걸 알 수 있으며 376, 377, 423 Line을 보게되면 생성자 인자로 들어오는 값들을 하나씩 Null 체크를 하는걸보니 Null값이 오면 NPE가 발생되는걸 확인할 수 있습니다.



AbstractImmutableList라는 추상클래스가 ImmutableCollections클래스의 내부클래스로 정의되어 있습니다.
추가적으로 AbstractImmutableSetAbstractImmutableMap도 내부클래스에 정의되어 있으며 ImmutableCollections클래스로 생성된 Collection 들은 모두 위의 AbstractImmutable이름으로 시작하는 추상클래스를 상속하도록 되어 있습니다.

 

그리고 add(), remove(), set(), replace()처럼 삽입, 삭제, 변경작업을 하게 될시 UnsupportedOperationException 예외가 발생됩니다. 즉, 이름 그대로 Immutable한 Collection 입니다.

 

정리

  Array.asList List.of
삽입 (add) 불가능 불가능
삭제 (remove) 불가능 불가능
변경 (set, replace) 가능 불가능
Null 허용여부 허용X 허용X
각 원소에 대한 Null 허용여부 허용 허용X

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함