실무 프로젝트로 배우는 Kotlin & Spring/JAVA 프로젝트에 코틀린 도입하기

Kotlin의 예외처리와 JAVA 예약어 접근 방법

webmaster 2022. 10. 23. 17:54
728x90

JAVA에서 Kotlin 예외 다루기

JAVA 예외, JAVA에서 Kotlin예외 호출하기

public class JavaThrow {

  public void throwIOException() throws IOException {
    //호출 시, try-catch로 감싸거나 예외를 전파해야한다
    throw new IOException("체크드 익셉션인 IOException 발생");
  }

  public static void main(String[] args) {
    /*
      JavaThrow javaThrow = new JavaThrow();
      try {
        javaThrow.throwIOException(); //checked exception이 발생했기 때문에 전파하거나 try-catch로 잡아야한다
      } catch (IOException e) {
        e.printStackTrace();
      }
    */
    //코틀린의 예외코드 호출
    KotlinThrow kotlinThrow = new KotlinThrow();
    //kotlinThrow.throwIOException(); //코틀린의 예외 코드를 실행하여도 try-catch를 강제하지 않아도 된다.
    //만약 try-catch를 하게 된다면, 컴파일 오류가 발생한다.
    //@Throws 어노테이션이 있다면 오류가 발생하지 않는다
    try {
      kotlinThrow.throwIOException();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Kotlin 예외, Kotlin에서 JAVA예외 호출하기

class KotlinThrow {

    @Throws(IOException::class) //강제로 예외 전파를 하고 싶을 때 사용
    fun throwIOException() {
        throw IOException("체크드 익셉션인 IOException 발생")
    }
}

fun main() {
    //예외를 전파하거나, try-catch를 사용하지 않아도 된다(강제하지 않는다)
    val javaThrow = JavaThrow()
    javaThrow.throwIOException()

    val kotlinThrow = KotlinThrow()
    kotlinThrow.throwIOException()

}
  • JAVA에서는 Checked Exception을 다룰 때, try-catch나 throws가 필수이다(예외를 잡거나, 전파해야 한다)
    • Kotlin에서는 Checked Exception이 존재하지 않음으로, 예외처리가 강제되지 않는다.
  • JAVA 코드에서 Kotlin의 예외를 호출할 때, try-catch로 감싸게 되면, 컴파일 오류가 발생하게 되는데, Kotlin에서 전달받은 예외를 잡거나, 전파하기를 강제하기 위해서는 @Throws 애노테이션을 사용해야 한다.
    • JAVA에서는 throws IOException를 사용해서 발생 가능 예외에 대해 사용하는 측에 전달할 수도 있기 때문에 Kotlin에서 JAVA와의 상호 운용을 위한 @Throws 애노테이션을 제공한다.
    • @Throws 애노테이션을 사용한 순간부터는 예외를 잡지 않거나, 전파하지 않을 경우 오류가 난다.

JAVA 예약어 접근

JAVA 코드(in, is는 JAVA에서 예약어가 아니다)

public class JavaKeyword {

  private InputStream in; //해당 프로퍼티는 코틀린의 키워드라 문제가 있다.
  private Boolean is;

  public InputStream getIn() {
    return in;
  }

  public void setIn(InputStream in) {
    this.in = in;
  }

  public Boolean getIs() {
    return is;
  }

  public void setIs(Boolean is) {
    this.is = is;
  }
}

enum CountryCodeJava {
  kr, jp, us;//, do;//do라는 도미니카 공화국을 추가하기 어렵다
}

Kotlin에서 호출(in, is는 Kotlin에서 예약어이다)

enum class CountryCodeKotlin {
    kr, jp, us, `do`; //코틀린에서는 백틱(`)을 사용하면 문제가 발생하지 않기 때문에 비지니스적으로 의미있는 이름을 쓸 수 있다
}


fun main() {
    val javaKeyword = JavaKeyword()

    javaKeyword.`in` //in은 코틀린에서 사용되는 예약어라 문제가 발생하지만, 백틱(`)을 사용하면 이를 해결 할 수있다

    javaKeyword.`is`
}
  • JavaKeyword의 in과 is 프로퍼티는 JAVA에서는 예약어가 아니지만, Kotlin에서는 예약어로 사용돼서 문제가 된다.
  • 백틱(`)을 사용하면, 이러한 문제를 해결할 수 있다.
  • 이러한 해결 방법은 비즈니스와 연결될 수 있다
    • 도미니카 공화국의 국가코드 do 같은 경우 JAVA, Kotlin에서 모두 예약어로 사용되어 사용하기 힘들다.
    • JAVA에서는 이를 해결하기 매우 힘들지만, Kotlin에서는 백틱(`)을 사용해서 해결할 수 있으며, 비즈니스적으로도 깔끔한 코드를 작성할 수 있다.
728x90