Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

코틀린(Kotlin)에서 사용자 지정 예외(Custom Exception) 만들고 발생시키는 방법

예외(Exception)는 모든 프로그래밍 언어에서 중요한 요소입니다. 적절한 예외 처리는 런타임에 코드가 잘못된 결과를 출력하는 것을 방지해 줍니다.

코틀린(Kotlin)의 예외 개념은 자바(Java)와 매우 유사합니다. 코틀린의 모든 예외는 Throwable 클래스의 하위 클래스이며, 개발자는 필요에 따라 자신만의 사용자 지정 예외(Custom Exception)를 만들 수 있습니다.

사용자 지정 예외는 비검사 예외(unchecked exception)에 속하기 때문에 컴파일 시점이 아닌 런타임에 발생합니다.

코틀린의 사용자 지정 예외를 본격적으로 살펴보기 전에, 먼저 검사 예외와 비검사 예외의 차이부터 이해해 보겠습니다.

검사 예외(Checked Exceptions)

검사 예외는 컴파일 시점에 확인되는 예외입니다. 대표적인 예로 FileNotFoundException이나 IOException이 있습니다. 아래 예제에서는 존재하지 않는 파일을 열려고 시도하여 검사 예외가 발생하는 상황을 보여줍니다.

예제 코드

import java.io.File
import java.io.InputStream

fun main(args: Array<String>) {
   try {
      val inputStream: InputStream = File("Hello.txt").inputStream()
   }
   catch(e:Exception) {
      e.printStackTrace()
   }
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다. 파일이 존재하지 않아 컴파일 및 실행 과정에서 FileNotFoundException이 발생한 것을 확인할 수 있습니다.

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar
java.io.FileNotFoundException: Hello.txt (No such file or directory)
   at java.io.FileInputStream.open0(Native Method)
   at java.io.FileInputStream.open(FileInputStream.java:195)
   at java.io.FileInputStream.(FileInputStream.java:138)
   at MainKt.main(main.kt:6)

비검사 예외(Unchecked Exceptions)

비검사 예외는 컴파일 시점에 확인되지 않고 런타임에 발생하는 예외입니다. ArithmeticException, NumberFormatException 등이 대표적인 예입니다. 아래 예제에서는 숫자가 아닌 문자열을 정수로 변환하려다 NumberFormatException이 발생하는 상황을 보여줍니다.

예제 코드

fun main(args: Array<String>) {
   try {
      val myVar:Int = 12
      val v:String = "Tutorialspoint.com"
      v.toInt()
   }
   catch(e:Exception) {
      e.printStackTrace()
   }
   finally {
      println("Exception Handling in Kotlin")
   }
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다. finally 블록이 먼저 실행된 후 예외 스택 트레이스가 출력되는 것을 볼 수 있습니다.

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar
Exception Handling in Kotlin
java.lang.NumberFormatException: For input string: "Tutorialspoint.com"
   at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
   at java.lang.Integer.parseInt(Integer.java:580)
   at java.lang.Integer.parseInt(Integer.java:615)
   at MainKt.main(main.kt:5)

코틀린에서 사용자 지정 예외 만들기

이제 간단한 예제를 통해 직접 사용자 지정 예외를 만들어 보겠습니다. 변수를 선언하고 그 값이 50보다 큰지 확인한 뒤, 조건에 따라 코틀린의 내장 기능을 활용하여 사용자 지정 예외를 던지는 방식입니다.

핵심은 Exception 클래스를 상속받는 새로운 클래스를 선언하는 것입니다. 생성자에서 메시지를 받아 부모 클래스에 전달하면, 예외 발생 시 원하는 메시지를 함께 출력할 수 있습니다.

예제 코드

fun main(args: Array<String>) {
    val sampleNumber:Int
    sampleNumber = 100
    if(sampleNumber > 50)
    {
       // 일반적인 검사 예외 대신 사용자 지정 예외를 던짐
       throw myCustomException("Invalid Inputs - Please enter a correct number")
    }
    else
    {
       println("Welcome !! you have entered a correct value")
    }
}

// 사용자 지정 예외 클래스 선언
class myCustomException(message: String) : Exception(message)

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다. 사용자 지정 예외가 발생하면서 생성자에 전달한 메시지가 함께 출력되는 것을 확인할 수 있습니다.

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar

Exception in thread "main" myCustomException: Invalid Inputs -
Please enter a correct number
at MainKt.main(main.kt:7)

마무리

이처럼 코틀린에서는 Exception 클래스를 상속하는 클래스 하나만 정의하면 손쉽게 사용자 지정 예외를 만들 수 있습니다. 애플리케이션의 도메인 로직에 맞는 의미 있는 예외를 정의하면, 오류 원인을 더 명확하게 전달할 수 있고 코드의 가독성과 유지보수성도 크게 향상됩니다.