함수가 원하는 결과를 만들어 낼 수 없을 때가 있습니다. 몇 가지 예를 들어보면 아래와 같습니다.
- 인터넷 문제로 서버로부터 데이터를 읽어 들이지 못한 경우
- 조건에 맞는 요소가 없는 경우
- 텍스트의 형식이 맞지 않아 파싱이 실패한 경우
이러한 사항을 처리하는 메커니즘은 크게 다음과 같이 두 가지가 있습니다.
- null 또는 '실패를 나타내는 sealed 클래스(일반적으로 Failure라는 이름을 붙입니다.)를 리턴한다.
- 예외를 throw 한다.
이러한 두 가지는 중요한 차이점이 있습니다.
예외는 특별한 상황을 나타내야 하기 때문에 정보를 전달하는 방법으로 사용하면 안됩니다. 그 이유를 정리하면 아래와 같습니다.
- 많은 개발자가 예외가 전파되는 과정을 제대로 추적하지 못합니다.
- Kotlin의 모든 예외는 unchecked 예외입니다. 따라서 사용자가 예외를 처리하지 않을 수도 있습니다.
- 예외는 예외적인 상황을 처리하기 위해서 만들어졌으므로 명시적인 테스트만큼 빠르게 동작하지 않습니다.
- try-catch블록 내부에 코드를 배치하면, 컴파일러가 할 수 있는 최적화가 제한됩니다.
반면에 null과 Failure는 명시적이고 효율적이며 간단한 방법으로 처리할 수 있기 때문에, 예상되는 오류를 표현할 때 굉장히 좋습니다.
또한 null과 Failure의 차이는, 추가적인 정보를 전달해야 한다면 sealed result 사용하고 그렇지 않은 경우에는 null을 사용하는게 일반적입니다.
따라서 충분하 예측할 수 있는 범위의 오류는 null과 Failure를 사용하고, 예측하기 어려운 예외적인 오류는 throw해서 처리하는게 좋습니다.
'Kotlin' 카테고리의 다른 글
[Effective Kotlin] 9 - use를 사용하여 리소스를 닫아라 (0) | 2023.03.26 |
---|---|
[Effective Kotlin] 8 - 적절하게 null을 처리하라 (1) | 2023.03.19 |
[Effective Kotlin] 6 - 사용자 정의 오류보다는 표준 오류를 사용하라 (0) | 2023.03.05 |
[Effective Kotlin] 5 - 예외를 활용해 코드에 제한을 걸어라 (0) | 2023.02.25 |
[Effective Kotlin] 4 - inferred 타입으로 리턴하지 말라 (0) | 2023.02.19 |