본문 바로가기
Kotlin

[Effective Kotlin] 7 - 결과 부족이 발생할 경우 null과 Failure를 사용하라

by 매운돌 2023. 3. 12.

함수가 원하는 결과를 만들어 낼 수 없을 때가 있습니다. 몇 가지 예를 들어보면 아래와 같습니다.

  • 인터넷 문제로 서버로부터 데이터를 읽어 들이지 못한 경우
  • 조건에 맞는 요소가 없는 경우
  • 텍스트의 형식이 맞지 않아 파싱이 실패한 경우

이러한 사항을 처리하는 메커니즘은 크게 다음과 같이 두 가지가 있습니다.

  • null 또는 '실패를 나타내는 sealed 클래스(일반적으로 Failure라는 이름을 붙입니다.)를 리턴한다.
  • 예외를 throw 한다.

이러한 두 가지는 중요한 차이점이 있습니다.

예외는 특별한 상황을 나타내야 하기 때문에 정보를 전달하는 방법으로 사용하면 안됩니다. 그 이유를 정리하면 아래와 같습니다.

  • 많은 개발자가 예외가 전파되는 과정을 제대로 추적하지 못합니다.
  • Kotlin의 모든 예외는 unchecked 예외입니다. 따라서 사용자가 예외를 처리하지 않을 수도 있습니다.
  • 예외는 예외적인 상황을 처리하기 위해서 만들어졌으므로 명시적인 테스트만큼 빠르게 동작하지 않습니다.
  • try-catch블록 내부에 코드를 배치하면, 컴파일러가 할 수 있는 최적화가 제한됩니다.

반면에 null과 Failure는 명시적이고 효율적이며 간단한 방법으로 처리할 수 있기 때문에, 예상되는 오류를 표현할 때 굉장히 좋습니다.

또한 null과 Failure의 차이는, 추가적인 정보를 전달해야 한다면 sealed result 사용하고 그렇지 않은 경우에는 null을 사용하는게 일반적입니다.

 

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