코틀린은 자바 jvm 에서 실행 할 수 있기 때문에 당연히 자바로 작성된 코드와 병행하여 사용이 가능합니다.
컴파일
두 코드를 같이 사용하는 방법은 크게 두가지 입니다.
대부분의 경우 빌드툴을 이용한 방법을 통해 사용하게 됩니다.
예제
gradle 빌드툴을 사용하여 빌드하는 예제입니다.
1 |
|
1 | // Constants.kt |
1 | package test; |
코틀린 탑레벨에 정의된 상수 값을 자바에서 사용하는 예제입니다. 코틀린에 정의된 상수를 자바에서 사용할 때 바로 변수를 사용하는것이 아닌 파일이름이 변형된 클래스 내부의 상수를 접근하는 형태로 사용하게 됩니다. 따라서 Constants.kt의 이름은 ConstantsKt 라는 네임스페이스로 변경되는 것으로 생각하시면 됩니다.
코틀린에서 자바 호출
코틀린에서 자바 코드를 호출하는 것은 큰 어려움이 없습니다. 코틀린 문법 자체가 자바보다는 넓기 때문에, 크게 문제가 될 부분은 없습니다. 또한 일부 자바의 문법이 코틀린에서 더 간략하게 표시가 됩니다.
1 | package test; |
1 | package test |
Test라는 자바 클래스에는 setter/getter, copy 메소드가 있습니다. 코틀린에서는 getter/setter 는 프로퍼티로 인식하기 때문에, 위 예제 처럼 별도의 함수 호출이 아닌 프로퍼티를 사용하는 형태로 사용됩니다. 그 외의 일반 메소드의 경우 그냥 메소드를 호출하는 일반적인 형태를 가집니다. 그리고 코틀린이 미리 등록된 지시어의 경우에는 `로 감싸서 사용합니다.
자바에서 코틀린 호출
1 | class Struct(val i: Int) { |
1 | public int structTest(Struct s1, Struct s2) { |
이전에 언급한대로 코틀린의 필드는 기본적으로 프로퍼티이기 때문에 자바에서는 이를 getter/setter로 인식하여 접근하게 됩니다.
그리고 연산자 오버로딩을 통해 작성된 메소드의 경우 이와 매치된 이름을 통해 호출 할 수 있게 됩니다.
companion object & object
1 | class Struct(val i: Int) { |
1 |
|
클래스 내부에 선언된 companion object 에 선언된 상수, 메소드의 경우 위 예제와 같이 사용이 가능합니다. 기본적으로 companion object 는 object 이기 때문에 내부에 선언된 메소드를 사용하기 위해선 해당 Companion 레퍼런스를 통해 메소드에 접근해야 하지만 @JvmStatic 어노테이션을 선언한 메소드의 경우 자바에서는 static 메소드로 인식할수 있게 됩니다. 따라서 클래스 이름을 통해 접근할 수 있게 됩니다. 또한 const val 로 선언된 상수의 경우도 클래스 이름을 통해 접근가능합니다.
람다
람다식은 자바에 사용하는 람다식 그대로를 사용합니다. 다만 매칭되는 인터페이스는 코틀린의 것을 따릅니다.
(Int) -> Int
형태의 람다의 경우 코틀린의 Function1<Int, Int>
이라는 인터페이스에 매칭됩니다. 이는 자바에 정의된 Function 과는 다른 인터페이스로 코틀린에 자체적으로 선언된 인터페이스 입니다.
1 | fun test(f: (Int) -> Int) { |
1 | test(i -> i + 10) |
파라메터 기본값 사용
1 |
|
1 | public void test() { |
파라메터 기본값이 있을 경우 자바에서 사용할 때는 기본값이 없는 형태만 사용할 수 있습니다. 따라서 @JvmOverloads
를 이용하여 컴파일 과정에서 오버로딩된 메소드를 추가하고 자바에서는 이를 사용할 수 있습니다.
탑레벨 함수 접근
파일 레벨에 정의된 탑레벨 함수의 경우 처음 예제 처럼 파일이름Kt 라는 네임스페이스로 묶어 접근할 수 있습니다. 이름이 마음에 안드는 경우 어노테이션을 이용해 수정할 수 있습니다.
1 | "Util") ( |
1 | public void t2() { |
어노테이션을 이용해 위 자바 코드 처럼 사용이 가능합니다.
예외 처리
코틀린은 기본적으로 예외를 명시적으로 처리하지 않는 unchecked exception가 기본입니다. 하지만 자바에서는 필요에 따라 checked exception를 사용해야하는 경우가 있습니다.
그런 경우엔 @Throw
어노테이션을 통해 선언가능합니다.
1 |
|
1 | public void test() { |
기타 어노테이션
그 외 자바에 있지만 코틀린에서는 지원하지 않는 키워드는 매치되는 어노테이션을 이용해 표현이 가능합니다.
- synchronized -> @Synchronized
- default(interface) -> @JvmDefault
- volatile -> @Volatile
- transient -> @Transient
기타 다른 어노테이션은 여기를 통해 확인할 수 있습니다.
출처
- 다재다능 코틀린 프로그래밍
- 코틀린 공식 문서