Calling Java with Kotlin

Java API를 코틀린에서 사용 가능한가?

얼마든지

// Java
public class Foo {
    void bar() {
        /...
    }
}
// Kotlin
val obj = Foo()
obj.bar

Object, Collections, primitive type 등은 코틀린에서 API 제공하기 때문에 Kotlin API 사용을 권장한다.

// kotlin
val obj: java.lang.Object = Object()

자바의 타입을 어떻게 매핑할까

  • 코틀린에서는 모든 것이 객체
  • 코틀린의 타입은 nullable, non-nullable로 구분

primitive type

자바의 기초타입은 null을 대입할 수 없다. 그래서 모틀린에서는 non-nullable로 매핑된다.

JavaKotlin
intkotlin.Int

Boxed-primitive type

Boxing된 primitive type은 객체이기 때문에 null 대입 가능, 그러므로 platform type으로 매핑한다.

JavaKotlin
java.lang.Integerkotlin.Int!

Platform type?

개발자가 명시적으로 선언할 수 있는 타입은 아니다. nullablity 정보가 없는 타입을 지칭한다. null 가능성에 대해 아무 정보가 없기 때문에 NPE 가능성이 높아진다. 개발자가 대응해야 한다.

Non-primitive type

JavaKotlin
java.lang.Objectkotlin.Any!
java.lang.Stringkotlin.String!

Collection type

코틀린에선 mutable/imumutable 타입으로 구분한다.

  • 기본적으로 platform type으로 처리
  • 기본적으로 mutable로 처리

Array

JavaKotlin
int[]IntArray!
String[]Array<(out) STring>!

Null Safety

@Nullable, @NotNull 어노테이션이 추가된 경우

  • @Nullable이 있으면 Nullable로 유추
  • @NotNull이 있으면 non-nullable로 유추

Getter/Setter

코틀린에서는 변수는 프로퍼티(not field)이다. 자바의 getter/setter도 프로퍼티로 이용 가능하다.

  • 프로퍼티 변환은 편의성 증대를 위해서,
  • 게터 세터를 직접 호출할 수 있다.

return void

Unit 타입으로 변환한다.

// java
class Foo {
    public void bar() {
        // ...
    }
}
// kotlin
val obj = Foo()
val result: Unit = obj.bar()

이스케이프

Java 배열 사용하기

코틀린의 배열은 invariant하다. 즉 Array<Any>Array<String>을 할당할 수 없다.

자바의 Integer[]Array<Int>로 사용하는데 없다. variant 문제 발생하지 않음

int[]Array<Int>로 표현 불가, primitive 타입.

vararg

문법적인 차이,

operator

자바 메서드를 연산자 재정의해서 호출 가능하다.

checked exception

코틀린에선 이 개념이 없다.

Object 메서드

Any는 JVM만을 위한 타입이 아니다. (JS, Native...)

wait() / notify()

Object로 캐스팅해서 사용

getClass()

::class.java로 사용

static member

final variable

val로 적용

초기화되지 않은 클래스 멤버 이용

런타임시 에러 발생 가능성 있음

자바 클래스 확장

가능하다.