본문 바로가기
Side Project/Socket

[Java] Collections.emptyList( ) vs List.of( )

by asdft 2024. 1. 25.

개요 

Socket 사이드 프로젝트를 하는 중에 List<String> 타입의 해시태그 값들을 받는데, 테스트 코드를 작성하면서 빈 리스트를 반환해야 할 일이 생겨서 두 방법의 차이점은 무엇인지 쓴다면 어떤것을 써야하는지 헷갈려서 정리하게 된 글이다.

 

- Collections.emptyList( )

EmptyList라는 클래스가 별도로 존재했고, 이를 List<T>타입으로 캐스팅해 반환해 주고 있었다.

 

EmptyList의 경우 get() 호출 시, IndexOutOfBoundsException을 터트리고, size( )는 0을 반환하고, isEmpty( ) 메소드 또한 true인것을 확인할 수 있다. 즉 완전히 빈 리스트를 정의하는 특징들을 갖고 있다.

 

위의 초록 글씨에서 볼 수 있듯이, Returns an empty list (immutable). 즉, 불변의 빈 리스트를 반환하는 것이다.

그래서 emptyList는 Immutable하기 때문에 add메서드를 호출하면 UnsupportedOperationException이 발생한다.


- List.of( )

List.of()를 통해서도 리스트를 생성할 수 있다. 다만 List.of()는 ImmutableCollections의 리스트가 반환되기 때문에 이 역시 불변이다.


List.of( ), Collections.emptyList( ) 공통점

둘 다 불변이기 때문에 add, remove등의 작업을 수행하려고 하면 예외가 발생한다. 

 

List.of( ), Collections.emptyList( ) 차이점

- List.of( ) 의 경우 of 안에 원소 설정이 가능해 get( )이나 size( ) 메소드 호출 시, 예외가 발생하지 않는다.

- Collections.emptyList( )의 경우 get( ) 메소드 호출시 Exception이 발생한다.

 

따라서,

어떤 값이 들어있는 List를 반환하고 싶은 경우, List.of( ) 사용

정말 아무값도 들어있지 않는 List를 반환하고 싶은 경우, Collections.emptyList( )를 사용