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
반응형