코딩하는 개굴이

[Kotlin] Kotlin <--> Java 의 예외처리 (+ 지정 키워드 escape 하여 사용하기) 본문

안드로이드/KOTLIN

[Kotlin] Kotlin <--> Java 의 예외처리 (+ 지정 키워드 escape 하여 사용하기)

개굴이모자 2023. 5. 7. 23:26
반응형

Java 의 예외 처리

Java 의 경우에는 아래와 같이 try catch 로 특정 checked exception 을 걸어 처리하도록 필수하고 있다.

public class JavaThrow {
	public void throwIOException() throws IOException {
		throw new IOException();
	}
}

public static void main() {
	JavaThrow javaThrow = new JavaThrow();
	try {
		javaThrow.throwIOException();
	} catch (IOException e) { //checked Exception
		e.printStackTrace();
	}
}

 

Kotlin 의 예외 처리, Java 의 Exception 처리하기

코틀린에서는 checked exception 이 존재하지 않기 때문에, 코드 작성 시에 아래와 같이 try catch 등의 별도 처리를 강제하지는 않는다.

class KotlinThrow {
	fun throwIOException() {
		throw IOException()
	}

	@Throws(IOException::class)
	fun throwsIOExceptionWithAnnotation() {
		throw IOException()
	}
}

fun main() {
	val javaThrow = JavaThrow()
	javaThrow.throwIOException()

	val kotlinThrow = KotlinThrow()
	kotlinThrow.throwIOException()
}

 

Java 에서 Kotlin 의 예외 처리하기

그리고, 코틀린으로 작성된 throw Exception 이 가능한 함수들의 처리 또한 자바에서 호출 시 try/catch 의 처리가 강제되지 않는다.

상단의 KotlinThrow 를 Java 의 main 함수 하위에서 호출해보자.

 

public static void main() {
	JavaThrow javaThrow = new JavaThrow();
	try {
		javaThrow.throwIOException();
	} catch (IOException e) { //checked Exception
		e.printStackTrace();
	}

	//KotlinThrow 클래스의 호출
	KotlinThrow kotlinThrow = new KotlinThrow();
	kotlinThrow.throwIOException();

	//try catch 를 감싸려하면 에러가 발생하게 되는데 그 이유는 throws 를 사용하지 않고
    //코틀린에서는 throw 를 사용하여 별도의 예외 전파를 사용하지 않고 있기 때문이다.
    //따라서, throws 어노테이션을 별도로 사용할 경우에만 try/catch 로 전파를 받을 수 있다.
   	//throws annotation 을 붙인 throwsIOExceptionWithAnnotation 사용
	try {
		kotlinThrow.throwsIOExceptionWithAnnotation();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

 

 

+ Kotlin 의 지정 키워드를 Java 에서 사용할 경우

만일 Java 에서 함수 이름을 is, in 등 Kotlin 에서 기본으로 지정된 키워드로 사용하고 있을 경우는 어찌 사용해야할까?

Kotlin 에서는 in 과 같이 back tic 으로 감싸 escape 하여 사용할 수 있다.

 

do while, when 등 기본적으로 사용되는 단어들에 대해 escape 를 할 수 있기 때문에 자바에 비해 더 유연성 있게 사용할 수 있다.

 

fun main() {
	val sampleClass = SampleClass()
	sampleClass.`in`
}
반응형
Comments