본문 바로가기

Reading Record/이펙티브 코틀린

[이펙티브 코틀린] Item7. 결과 부족이 발생할 경우 null과 failure를 사용하라

함수가 원하는 경우를 만들 수 없는 경우

  • 서버로 데이터를 읽어 들이려고 했는데, 인터넷 연결 문제로 읽어 들이지 못한경우
  • 조건에 맞는 첫 번째 요소를 찾으려 했는데, 조건에 맞는 요소가 없는 경우
  • 텍스트를 파싱해서 객체를 만들려고 했는데, 텍스트의 형식이 맞지 않는 경우

→ null or throw를 발생한다. 정보를 전달해야하는 상황에는 throw를 리턴하고, 추가 정보를 리턴해야하는 경우에는 sealed. 클래스를 사용한다.

정보를 전달해야 하는 경우 예외를 사용하면 안되는 이유

  • 전파되는 과정 추적이 어려움
  • 코틀린은 unchecked 예외만 존재하므로 예외처리에 자유도가 있음
  • try-catch 블록 내부에 코드를 배치하면 컴파일러 최적화 제한된다

예측이 가능한 오류 범위일 경우에는 null 과 Failure를 사용하고 어려운 예외적인 범위의 오류는 예외를 throw한다.

val random = Random()

fun someMethod(): Result<String> {
    val num = random.nextInt(5)
    return if (num == 1) {
        Failure(IllegalStateException())
    } else {
        Success("직업 성공")
    }
}

sealed class Result<out T>
class Success<out T>(val result: T) : Result<T>()
class Failure(val throwable: Throwable) : Result<Nothing>()

이렇게 Result와 같은 결과 봉투 클래스를 활용해 리턴하면 클라이언트 측에서 when 절을 활용해 결과를 처리하기 용이해지고, try-catch블록보다 효율적임

  • 만약 null을 리턴하더라도 Elvis 연산자를 활용해 널 안정성 기능을 활용하여 처리가능

→ null과 sealed의 차이는 추가정보 전달 필요여부로 정한다.

참고