본문 바로가기
개발/Java

[Java] Null 대신 빈 컬렉션이나 배열을 리턴할 것

by devhooney 2023. 6. 28.
728x90

컬렉션이 비어 있을 경우 null을 리턴하기도 한다.

그 예시로

private final List<Example> exampleList = ...;

public List<Example> getExample() {
	return exampleList.isEmpty() ? null : new ArrayList<>(exampleList);
}

이렇게 사용을 하기도 하는데, 이렇게 할 경우 리턴 받는 쪽에서 null을 처리하는 코드를 추가로 작성해야 한다.

혹시나 null 처리 코드가 없을 경우 에러가 발생할 확률이 높다.

이를 방지하기 위해서는

public List<Example> getExample() {
	return new ArrayList<>(exampleList);
}

이렇게만 해주면 null처리 코드가 없어도 에러가 발생할 확률을 낮출 수 있다.

하지만 이렇게 할 경우 성능 저하가 있을 수 있기 때문에,

public List<Example> getExample() {
	return exampleList.isEmpty() ? Collections.emptyList() : new ArrayList<>(exampleList);
}

매번 빈 컬렉션을 리턴하면 성능 저하를 막을 수있다. (Map일 경우 Collections.emptyMap() 사용)

 

배열도 마찬가지로,

public Example[] getExample() {
	return exampleList.toArray(new Example[0]);
}

// 성능 저하 방지
private static final Example[] EMPTY_EXAPLE_ARRAY = new Example[0];

public Example[] getExample() {
	return exampleList.toArray(EMPTY_EXAPLE_ARRAY);
}

 

- 핵심 정리

null이 아닌, 빈 배열이나 컬렉션을 반환할 것. null을 반환하는 API는 번거롭다. 성능이 좋은 것도 아니다.

 

 

- ChatGPT 답변

1. Null 포인터 예외 방지: Null 값을 반환하면 클라이언트 코드에서 Null 포인터 예외(NullPointerException)가 발생할 수 있다. 이는 프로그램의 안정성과 신뢰성을 저하시킬 수 있다. 빈 컬렉션 또는 배열을 반환하면 클라이언트 코드에서 추가적인 Null 체크를 할 필요가 없어지므로 예외가 발생할 가능성을 줄일 수 있다.

2. 코드 간결성과 가독성: 빈 컬렉션 또는 배열을 반환하면 클라이언트 코드에서 추가적인 Null 체크와 예외 처리를 할 필요가 없어지므로 코드가 더 간결하고 가독성이 좋아진다. Null을 처리하는 논리가 코드 여기저기 흩어지지 않고 한 곳에서 처리되므로 유지 보수성도 향상된다.

3. 안전한 연산 가능: Null을 반환하는 경우 클라이언트 코드에서 Null 값을 사용하려고 하면 예외가 발생한다. 반면에 빈 컬렉션 또는 배열을 반환하면 클라이언트 코드에서 안전하게 반복문 또는 다른 작업을 수행할 수 있다. 이를 통해 예기치 않은 예외 상황을 방지하고 안전한 연산을 가능하게 한다.

4. 일관성 유지: 메서드가 항상 빈 컬렉션 또는 배열을 반환한다면 클라이언트 코드는 항상 빈 컬렉션 또는 배열을 받을 것으로 예상할 수 있다. 이는 코드의 일관성을 유지하고 클라이언트 코드의 복잡성을 줄여준다.

따라서 Null 대신 빈 컬렉션 또는 배열을 반환하는 것은 프로그램의 안정성, 가독성, 유지 보수성을 향상시키는 좋은 프로그래밍 관행이다. 그러나 이는 상황에 따라 다를 수 있으므로 개발자는 각각의 상황과 요구사항에 맞게 적절한 방식을 선택해야 한다.

 

 

 

위에서 예시를 든 것을 길게 글로 표현한거 같다.

 

내 설명과 코드는 모두 이펙티브 자바를 참고했다.

728x90