[kotlin] exception

sujin·2023년 6월 14일
0

kotlin

목록 보기
1/1

오늘은 kotlin이 java와 유사한데 예외처리 부분에서 차이가 존재하고 상호운용성을 위해서 어떤 방식으로 예외처리를 진행해야할지에 대해서 공유하려고한다!

0. Intro

kotlin에는 자바처럼 compile 시점에 발생하는 checked 예외와 unchecked 예외로 구분되어있지 않다.
따라서 java처럼 throws를 사용해서 method에 지정하지 않아도 된다는 것을 의미하고 이는 곧, 다른 method에서도 메서드 시그니처에 지정하지 않고 쉽게 예외처리가 가능하다는 것이다.

예를 들어서,
IOException()의 경우에는 unchecked exception에 포함된다. 이때, 해당 exception을 포함하는 메서드를 살펴보자.

fun throwJavaChecked() {
    throw IOException()
}

다음과 같은 method가 존재한다고 할 때, method에 java에서 사용하는 것처럼 throws가 존재하지 않는다. checked exception이 존재하지 않기 때문에 signature에 선언하지 않아도 다른 함수에서 예외를 쉽게 던질 수 있게 되는 것이다.

그렇다면, java를 사용해서 kotlin으로 만든 throwJavaChecked()를 호출하여 사용하면 어떻게 될 것인가? 여기부터가 개발할 때 문제가 될 것이다.

public static void checked() {
    try {
        ThrowsKt.throwJavaChecked();
    } catch (IOException e) {
        System.out.println("Won't even compile");
    }
}

Java compiler는 오류 메시지를 내보내면서 코드 컴파일에 실패하게 될 것이다. java에서는 checked exception throws를 사용하지 않고는 처리할 수 없다.

그렇다면 이때 어떻게 해야할까? kotlin에서는 이러한 문제점을 해결하기 위해서 throws annotation을 제공한다.

우선 상호 운용성을 위한 방법을 알아보기 전에 코틀린에 왜 checked exception이 존재하지 않는지에 대해서 먼저 알아보자!!

1. kotlin에서의 checked exception가 존재하지 않는 이유

공식 문서를 살펴보면, 왜 코틀린에서 확인된 예외를 제공하지 않는지에 대해서 나와있다.

Appendable append(CharSequence csq) throws IOException;

자바에서는 try-catch를 활용해서 예외처리를 매번 진행해줘야한다. 그렇다는 것은 throws를 활용해서 개발자가 try-catch로 처리하도록 넘긴다는 것과 동일한 말이 된다.

그렇다면, 이것은 과연 좋은 것인가?

소규모 프로젝트가 아니라 대규모 프로젝트라면 해당 사항은 매우 불편함으로 작용될 것이다.
개발자의 생산성이 감소하게 될 것이고 (예외처리를 개발자가 매번 해줘야하기 때문에) 코드 품질(코드도 그에 따라서 추가적으로 생겨나게 될 것임) 에도 도움이 되지 않을 것이다.
따라서 이러한 문제점으로 인해서 JAVA에서의 checked exception 개념이 사라지게 됐다.

이제는 그러면 checked exception이 사라졌으니, 상호 운용성을 어떻게 가져야할지에 대해서 알아보자!

2. @Throws annotation

코틀린은 checked error의 개념이 존재하지 않기 때문에 예상되는 예외 클래스 목록을 throws를 활용해서 알려줘야한다.

코틀린의 method or function에 @Throws를 추가하면 시그니처에 throws 절을 사용해서 해당 메서드나 함수를 컴파일한다. 따라서 컴파일시 발생가능한 checked exception을 처리할 수 있게된다.
따라서, Java에서 kotlin function을 사용하고 checked exception이 존재하는 경우에 compile시에 exception을 처리할 수 있게된다.

마무리

어디까지나 @Throws annotation은 java와의 상호운용성을 위해서 사용할 뿐이지 코틀린 자체를 위한 주석은 아니라는 것을 기억해야 할 것으로 보인다.

0개의 댓글