코틀린의 예외 처리 함수 require()와 check()

  1. require()와 requireNotNull()
  2. require()와 requireNotNull() 예시
  3. check()와 checkNotNull()
  4. check()와 checkNotNull() 예시
  5. 결론
  6. 참고 자료

require()와 requireNotNull()

  • require() - 매개변수의 값이 참인지 검사하고, 그 값이 거짓이라면 ‘IllegalArgumentException’을 발생시킨다.
  • requireNotNull() - 매개변수의 값이 null이 아니라면 값을 반환하고, null이라면 마찬가지로 ‘IllegalArgumentException’을 발생시킨다.

require()와 requireNotNull()은 다음과 같이 정의 되어 있다.

require()와 requireNotNull() 예시

fun readInt(): Int {
    val input = readln()

    // if 조건문으로 예외 발생
    if(input.toIntOrNull() == null)
        throw IllegalArgumentException("숫자만 입력 가능합니다")

    // require 사용
    require(input.toIntOrNull() != null) { "숫자만 입력 가능합니다" } // null이라면 'IllegalArgumentException'가 발생한다.

    ...
}
  • 위 코드만 봐도 require를 사용하면 조금 더 간결하게 예외 처리를 할 수 있다.
fun readInt(): Int {
    val input = readln()

    // if 조건문으로 예외 발생
    if(input.toIntOrNull() == null)
        throw IllegalArgumentException("숫자만 입력 가능합니다")
    else
        return input.toInt()

    // requireNotNull 사용
    return requireNotNull(input.toIntOrNull()) { "숫자만 입력 가능합니다" } // null이라면 'IllegalArgumentException'가 발생하고, 아니라면 해당 값을 반환하게 된다.
}
  • requireNotNull을 사용하면 위와 같은 if else 예외 처리 및 값 반환 코드를 단 한 줄에 처리 가능하다.

check()와 checkNotNull()

  • check() - 매개변수의 값이 참인지 검사하고, 그 값이 거짓이라면 ‘IllegalStateException’을 발생시킨다.
  • checkNotNull() - 매개변수의 값이 null이 아니라면 값을 반환하고, null이라면 마찬가지로 ‘IllegalStateException’을 발생시킨다.

check()와 checkNotNull() 다음과 같이 정의 되어 있다.

check()와 checkNotNull() 예시

fun run(isRunning: Boolean, job: () -> Unit) {
    // if 조건문으로 예외 발생
    if(isRunning)
        throw IllegalStateException("이미 실행중입니다")

    // check 사용
    check(isRunning) { "이미 실행중입니다" } // 값이 참이면 job을 실행하게 되고 아니라면, 'IllegalStateException'를 발생시킨다.

    job()
}
  • 마찬가지로 check를 사용하면 조금 더 간결하게 예외 처리를 할 수 있다.
class Lotto {
    var runningState: Boolean ?= null

    fun run(job: () -> Unit) {
        // if 조건문으로 예외 발생
        val state = if (runningState == null) {
            throw IllegalStateException("상태가 null입니다")
        } else {
            runningState
        }

        // checkNotNull 사용
        val state2 = checkNotNull(runningState) { "상태가 null입니다" } // null이라면 'IllegalStateException' 발생하고, 아니라면 해당 값을 반환하게 된다.

        job()
    }
}

결론

  • 결국엔 require()나 check()나 requireNotNull()이나 checkNotNull()이나 결국엔 같은 거 아니야? 라고 생각할 수 있다.
  • 이 두(require vs check) 함수는 발생시키는 예외가 각각 ‘IllegalArgumentException’와 ‘IllegalStateException’이므로, 사용하는 목적에 따라 알맞게 사용하면 된다.

    ‘IllegalArgumentException’는 값에 대한 예외(값 검증 등)를 처리할 때, ‘IllegalStateException’는 상태에 대한 예외(메소드가 이미 호출 됐다거나 사용중이거나 등)를 처리할 때 사용한다고 알고 있다. 메서드가 불법적이거나 부적절한 시간에 호출되었음을 알립니다…. - Android developers

참고 자료