[Kotlin] kotlin 에서 자바 코드 접근하기

Kotlin & Java

Posted by JungHoon-Park on February 15, 2021

Kotlin 에서 Java 코드 접근하기


Null 안전성

자바의 참조 타입을 코틀린으로 불러오면 타입 이름 뒤에 느낌표(!)가 붙는다.(ex, String!) 타입 이름 뒤의 !는 이 타입이 Nullable인지, Not-Null인지 알 수 없다는 뜻이다. 자바의 참조 타입은 무조건 null을 허용하기 때문에 이런 일이 벌어진다. 반면 int와 같은 원시 타입의 경우, null 값이 들어갈 수 없으므로 느낌표 없이 Int 타입으로 인식된다.

1
2
3
public interface JavaInterface {
    String trim(String str);
}

String 타입의 인수를 받아 String 타입의 값을 반환하는 trim 함수를 갖는 자바 인터페이스 이다.

1
2
3
4
5
6
7
8
class KotlinClass: JavaInterface {
    override fun trim(str: String?): String = str?.trim() ?: ""
}

fun main() {
    val javaInterface: JavaInterface = KotlinClass()
    println(javaInterface.trim(" hi "))
}

String! 타입은 String? 이나 String 으로 적을 수 있다. 일반적으로 String? 으로 적어주는 것이 안전하며, 절대로 null 이 들어오지 않는 다는 확신이 있다면 String으로 써도 무방하다. 단, String으로 적었는데 이 곳에 null 값이 들어온다면 KotlinNullPointerException 이 발생한다.
만일 자바에서 이 매개변수로 절대 null 값이 들어오지 않는다는 것을 보장하고 싶으면 어떻게 해야할까? 그럴 때는 @NotNull 을 사용하면된다.

1
2
3
public interface JavaInterface {
    String trim(@Notnull String str);
}

@NotNull 이 붙은 String 타입은 코틀린에서 느낌표 없이 String 그대로 인식된다. @NotNull의 반대로 @Nullable 타입도 있다. String 타입 앞에 @Nullable을 붙이면 코틀린에서 String? 타입 으로 인식된다.

Getter/Setter

간단한 자바 클래스를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class JavaClass {
    private int value;

    public int getSomething() {
        return value;
    }

    public void setSomething(int value) {
        this.value = value;
    }

    public double getDoubleValue() {
        return 3.14;
    }

    public boolean isGood() {
        return true;
    }
}

[코틀린 예제]

1
2
3
4
5
6
7
8
9
fun main() {
    val java = JavaClass()

    java.something = 301
    println(java.something)

    println(java.isGood)
    println(java.doubleValue)
}

[ 결과 ]

1
2
3
301
true
3.14

만약 자바 클래스에 get~ , set~ 으로 시작하는 메서드가 있다면, 코틀린에서 프로퍼티로 접근이 가능하다. getSomething, setSomething 메서드는 둘 다 int 타입의 값을 다루므로 Int 타입의 프로퍼티로 인식된다.