결과 부족이 발생할 경우 null과 Failure를 사용하라 #
함수가 원하는 결과를 만들어 낼 수 없는 경우가 있다. 이런 상황을 처리하는 메커니즘은 크게 두 가지가 있다.
- null 또는 Failure를 나타내는 seald 클래스
- 예외 throw
위 두 가지는 중요한 차이점이 있다.
Exception (예외) #
예외는 정보를 전달하는 방법으로 사용해서는 안된다. 예외는 잘못된 특별한 상황을 나타내고 처리해야 한다.
immutable 컬렉션의 경우 명시적으로 Exception 을 사용하지 않던가…🤔 어떻게 보느냐가 중요할 것 같다. 메시지 전달을 포함하여 잘못된 상황을 처리하는 것이기도 하니까.
예외는 예외적인 상황(예상하지 못한 상황)이 발생했을 때 사용하는 것이 좋다.
이유는 다음과 같다.
- 많은 개발자가 전파된 예외를 제대로 처리하지 않는다. (추적하지 못한다.)
- 코틀린의 모든 예외는 unchecked 예외이다. (중요)
- 따라서, 사용자가 예외를 제대로 처리하지 않을 수도 있으며, 이런 내용들이 문서에 제대로 드러나지 않기도 한다.
- 예외는 예외적인 상황을 위해 만들어졌다. 명시적인 테스트만큼 빠르게 동작하지 않는다. (= 빠른 실패를 말하는건가? 🤔 )
- try-catch 블록 내부에 코드를 배치하면, 컴파일러가 할 수 있는 최적화가 제한된다. (중요)
null, Failure(= seald 클래스) #
반면, null, Failure 는 예상되는 오류를 표현할 때 굉장히 좋다. 명시적이고, 효율적이며, 간단한 방법으로 처리할 수 있다. 이렇게 처리되는 오류는 다루기 쉽고, 놓치기 어렵다.
null 값과 sealed 클래스의 차이점은 다음과 같이 정리할 수 있다.
추가적인 정보를 전달해야 한다면 sealed 클래스를 사용하고, 그렇지 않다면 null을 사용한다.
결론 #
충분히 예측할 수 있는 범위의 오류는 null과 Failure를 사용하고,
예측하기 어려운 예외적인 범위의 오류는 예외를 throw해서 처리하는 것이 좋다.
요약 #
:star: 코틀린은 모두 unchecked 예외다. (제대로 처리되지 않고 전파되기 쉽다.)
Exception | null, Failure |
---|---|
놓치기 쉽다. | 놓치기 어렵다. |
애플리케이션을 중지시킬 수 있다. | 애플리케이션을 중지시키지 않는다. |
예상하지 못한 경우다. (= 예외적인 경우다.) | 예상할 수 있는 경우다. |