JVM/Java

[Java]Collections.emptyList() vs. new instance 어떤 차이가 있을까?

Hyo Kim 2021. 6. 6. 00:28
728x90
반응형

🤔서론

스택오버플로우를 보다가 아하! 싶은 내용이 있길래 정리를 해본다.

 

리턴을 null로하는 것은 매우매우 위험한 행동이다.

그렇기에 우리는 새 인스턴스를 만들어서 리턴을 시켜줄수도 있고,

라이브러리를 통해 emptyList()를 리턴해줄수도 있다.

둘은 어떤 차이가 있을까?


😆본론

아래 두 방식의 차이를 알아보자.

return Collections.emptyList();
return new ArrayList<Foo>();

 

일단 Collections.emptyList()가 뭔지 알면 쉽게 정리할 수 있다.

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

 

이 메서드를 구현하면 각 호출에 대해 별도의 목록 개체를 만들 필요가 없습니다. 이 방법을 사용하면 이름이 비슷한 필드를 사용하는 것과 유사한 비용이 발생할 수 있습니다. (이 방법과 달리 이 필드에서는 형식 안전을 제공하지 않습니다.)
참고

static으로 이미 만들어진 객체를 불러다 사용하는 것이기 때문에

CPU와 메모리에 추가비용이 발생하는 것을 방지할 수 있다.

 

이는 메소드를 자주 불러다 쓰는 경우 새 인스턴스를 매 번 만드는 방식보다

확실히 성능차이가 발생할 수 있다.


🤗그렇다면 무조건 emptyList() 사용하면 되겠네!

ㄴㄴㄴ

아니지. 아니다.

위에 메소드를 보면 알겠지만 final로 선언되어 있다.

이는 불변객체라는 말이므로 만약 저 객체를 받아서 값을 추가하거나 변경을 시도할 경우

UnsupportedOperationException() 발생하게 된다.

 

만약 객체를 받아 값을 변경해야 하는 경우에는 새 인스턴스를 만들어서 리턴해주는 방법을 사용해야 한다.


😏결론

항상 무조건 맞는 방식은 없는 것 같다.

상황에 따라서 유연하게 대처할 수 있도록 내가 쓰고 있는게 정확히 어떤 것인지 파악하는게 중요하다.

 

인용 사이트

https://stackoverflow.com/questions/5552258/collections-emptylist-vs-new-instance

 

728x90
반응형