아이템 07. 결과 부족이 발생할 경우 Null과 Failure를 사용하라

아이템 07. 결과 부족이 발생할 경우 Null과 Failure를 사용하라

결과 부족이 발생할 경우 null과 Failure를 사용하라 #

함수가 원하는 결과를 만들어 낼 수 없는 경우가 있다. 이런 상황을 처리하는 메커니즘은 크게 두 가지가 있다.

  1. null 또는 Failure를 나타내는 seald 클래스
  2. 예외 throw

위 두 가지는 중요한 차이점이 있다.

Exception (예외) #

예외는 정보를 전달하는 방법으로 사용해서는 안된다. 예외는 잘못된 특별한 상황을 나타내고 처리해야 한다.

immutable 컬렉션의 경우 명시적으로 Exception 을 사용하지 않던가…🤔 어떻게 보느냐가 중요할 것 같다. 메시지 전달을 포함하여 잘못된 상황을 처리하는 것이기도 하니까.

예외는 예외적인 상황(예상하지 못한 상황)이 발생했을 때 사용하는 것이 좋다.

이유는 다음과 같다.

  • 많은 개발자가 전파된 예외를 제대로 처리하지 않는다. (추적하지 못한다.)
  • 코틀린의 모든 예외는 unchecked 예외이다. (중요)
    • 따라서, 사용자가 예외를 제대로 처리하지 않을 수도 있으며, 이런 내용들이 문서에 제대로 드러나지 않기도 한다.
  • 예외는 예외적인 상황을 위해 만들어졌다. 명시적인 테스트만큼 빠르게 동작하지 않는다. (= 빠른 실패를 말하는건가? 🤔 )
  • try-catch 블록 내부에 코드를 배치하면, 컴파일러가 할 수 있는 최적화가 제한된다. (중요)

null, Failure(= seald 클래스) #

반면, null, Failure 는 예상되는 오류를 표현할 때 굉장히 좋다. 명시적이고, 효율적이며, 간단한 방법으로 처리할 수 있다. 이렇게 처리되는 오류는 다루기 쉽고, 놓치기 어렵다.

null 값과 sealed 클래스의 차이점은 다음과 같이 정리할 수 있다.

추가적인 정보를 전달해야 한다면 sealed 클래스를 사용하고, 그렇지 않다면 null을 사용한다.


결론 #

충분히 예측할 수 있는 범위의 오류는 null과 Failure를 사용하고,
예측하기 어려운 예외적인 범위의 오류는 예외를 throw해서 처리하는 것이 좋다.


요약 #

:star: 코틀린은 모두 unchecked 예외다. (제대로 처리되지 않고 전파되기 쉽다.)

Exceptionnull, Failure
놓치기 쉽다.놓치기 어렵다.
애플리케이션을 중지시킬 수 있다.애플리케이션을 중지시키지 않는다.
예상하지 못한 경우다. (= 예외적인 경우다.)예상할 수 있는 경우다.