티스토리 뷰

언어/Kotlin

[Kotlin]예외(Exception) 처리

꼬마우뇽이(원종운) 2022. 3. 20. 10:28

예외처리

코틀린에서 예외(Exception) 처리는 자바와 거의 비슷합니다. 함수는 예외를 던질 수 있으며, 해당 예외는 함수를 호출하는 쪽에서 그 예외를 잡아 처리할 수 있습니다.

 

발생한 예외를 함수를 호출하는 쪽에서 처리(catch) 하지 않으면 함수 호출 스택에 쌓이면서 예외를 처리하는 부분이 나올 때까지 예외를 다시 던지게(rethrow)된다. 즉 전파(propagation)가 됩니다.

 

예외 던지기

예외는 자바와 동일하게 throw 키워드를 사용하여 던질 수 있습니다. 다만 코틀린은 명시적으로 new 키워드를 쓰지 않아도 객체를 생성할 수 있기 때문에 다음과 같이 예외를 던질 수 있습니다.

 

fun main() {
    val input = 102
    val score = if (input in 0..100) {
        input
    } else {
        throw IllegalArgumentException("올바르지 않은 점수 범위입니다.")
    }
}

 

결과

 

현재는 예외를 잡아주지 않고 프로그램이 종료되었지만, 다음과 같이 만약 함수를 호출하는 쪽에서 예외를 잡지 않는다면 결과 메시지는 어떻게 달라질까요?

 

fun validateScore(input: Int): Int {
    return if (input in 0..100) {
        input
    } else {
        throw IllegalArgumentException("올바르지 않은 점수 범위입니다.")
    }
}

fun main() {
    val input = 102
    validateScore(input)
}

 

결과

위에서 설명했듯이 예외 처리하는 부분이 나올 때까지 함수 호출 스택에 쌓이면서 예외를 처리하는 부분이 나올 때까지 예외를 다시 던지게 됩니다. 실질적인 에외는 validateScore 함수에서 던져졌지만, main 함수까지 전파된 것을 확인할 수 있습니다.

 

예외 잡기

던져진 예외는 try - catch 표현식을 통하여 예외 처리를 할 수 있습니다. try 블록 내에서 발생하는 모든 예외는 catch 블록으로 내려가 패턴 매칭이 이루어지게 됩니다.

 

또한 try - catch 문법은 자바와는 다르게 코틀린에서는 "문(statement)"이 아니라 "표현식(expression)"이라는 점을 알고 있으면 좋습니다. 즉 값을 반환한다는 의미입니다. try, catch의 블록의 마지막 줄의 결괏값은 try - catch 표현식의 결괏값이 된다는 사실입니다.

 

fun validateScore(input: Int): Int {
    return if (input in 0..100) {
        input
    } else {
        throw IllegalArgumentException("올바르지 않은 점수 범위입니다.")
    }
}

fun main() {
    val input = 100
    val score = try {
        validateScore(input)
        input // try-catch 문의 결과값이 된다.
    } catch (e: IllegalArgumentException) {
        null // try-catch 문의 결과값이 된다.
    }
    println(score)
}

 

결과

 

100

 

만약 input이 0보다 작거나 100보다 큰 경우 score의 값은 무엇이 될지는 직접 해보시면 좋을 것 같습니다.

 

Checked Exception과 UnChecked Exception

자바에서는 예외를 Checked Excetpion, UnChecked Exception으로 나누어 처리를 합니다. Checked Exception의 경우는 예외 처리를 발생하는 쪽에서 처리를 강제하고 있으며, 만약 처리를 하지 않는다면 예외가 발생하는 메서드를 호출하는 쪽에서 예외를 처리한다는 것을 명시적으로 코드 상에서 throws 구문을 통하여 명시하여야 했습니다.

 

하지만, 실질적으로 Checked Exception이 발생하는 경우는 프로그래머가 추가적인 조치를 한다고 해서 달라지는 게 없는 예외들입니다. 그렇기 때문에 많은 개발자들은 이러한 부분을 싫어했고, 다른 모던 언어들에서도 Checked Exception과 UnCheckedExcetpion을 구분하지 않기 시작했습니다.

 

코틀린 또한 Checked Excetpion과 UnChecked Exception을 구분하지 않습니다.

 

'언어 > Kotlin' 카테고리의 다른 글

[Kotlin]데이터 클래스(data class)  (0) 2022.03.20
[Kotlin]인터페이스(interface)  (0) 2022.03.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함