Android

[Android] 코틀린(Kotlin)과 자바(Java)의 상호운용

구루싸 2020. 6. 7. 13:40
반응형
SMALL

이전까지 코틀린(Kotlin)에 대해 전반적으로 학습하였습니다

그런데 코틀린 코드는 자바 바이트코드로 컴파일되므로

자바와의 상호운용이 된다는 것을 짐작하셨을텐데요

그래서 오늘의 학습 주제는 바로 이 부분입니다

자바와의 상호운용은 코틀린의 중요한 특성이여

코틀린 파일과 자바 파일이 같은 프로젝트에 공존할 수 있습니다

1. Jhava.java

import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

public class Jhava {

    private int hitPoints = 52489112;
    private String greeting = "BLARGH";

    @NotNull
    public String utterGreeting() {
        return greeting;
    }

    @Nullable
    public String determineFriendshipLevel() {
        return null;
    }

    public int getHitPoints() {
        return hitPoints;
    }

    public String getGreeting() {
        return greeting;
    }

    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }

    public void offerFood() {
        Hero.handOverFood("Pizza");
    }

    public void extendHandInFriendship() throws Exception {
        throw new Exception();
    }

    public void apologize() {
        try {
            Hero.acceptApology();
        } catch (IOException e) {
            System.out.println("Caught!");
        }
    }

    public static void main(String[] args) {
        System.out.println(Hero.makeProclamation());

        System.out.println("Spells:");
        Spellbook spellbook = new Spellbook();
        for ( String spell: spellbook.spells) {
            System.out.println("\t" + spell);
        }
        System.out.println("Max spell count: " + Spellbook.MAX_SPELL_COUNT);
        Spellbook.getSpellbookGreeting();

        Function1<String, Unit> translatorJ = Hero.getTranslator();
        translatorJ.invoke("TRUCE");
    }
}

2. Hero.kt

@file:JvmName("Hero")

import java.io.IOException
import java.lang.Exception

fun main(args: Array<String>) {
    val adversary = Jhava()
    println(adversary.utterGreeting())

    val friendshipLevel = adversary.determineFriendshipLevel()
    println(friendshipLevel?.toLowerCase() ?: "Don't know what it means")

    val adversaryHitPoints: Int = adversary.hitPoints
    println(adversaryHitPoints.dec())
    println(adversaryHitPoints.javaClass)

    adversary.greeting = "Hello, champion!"
    println(adversary.utterGreeting())

    adversary.offerFood()

    try {
        adversary.extendHandInFriendship()
    } catch (e: Exception) {
        println("Bye, monster!")
    }
}

val translator = { utterance: String ->
    println(utterance.toLowerCase().capitalize())
}

fun makeProclamation() = "Hello, monster!"

@JvmOverloads
fun handOverFood(leftHand: String = "Strawberry", rightHand: String = "Meat") {
    println("Hand over $leftHand and $rightHand")
}

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

class Spellbook {
    @JvmField
    val spells = listOf("Magic Ms.L", "Lay on Hans")

    companion object {
        @JvmField
        val MAX_SPELL_COUNT = 10

        @JvmStatic
        fun getSpellbookGreeting() = println("I am guru")
    }
}

위의 코드에서 Jhava 클래스는 java 파일에

main은 Kotlin 파일에 있고

상호 운용되는 모습을 보여줍니다

자바의 모든 객체는 언제든지 null이 될 수 있는데

null 값이 될 수 있는 자바의 값 타입을 코틀린에서는 String!로 나타냅니다

이를 플랫폼 타입(Platform Type)이라고하는데

문제가 발생하겠죠?

이를 해결하기 위해 애노테이션을 사용합니다

애노테이션을 사용하기 위해서는

org.jetbrains.annotations 라이브러리를 추가해야합니다

인텔리제이 메인 메뉴의 File → Project Structure를 선택 후

나온 대화창에서 Libraries를 클릭하고

KotlinJavaRuntime이 있는 곳에서 마우스 우클릭하면

아래와 같은 화면이 보일 것이고 From Marven을 선택합니다

이후에 org.jetbrains:annotations:16.0.2를 입력하고

OK를 하면 다운되어 현재 프로젝트에 추가됩니다

자 이제 nullable로 인해 코틀린에서

안전 호출 연산자 처리가 가능해집니다

위의 코드에서 여러 애노테이션들을 사용하고 있는데

애노테이션들에 대한 설명들은 생략하겠습니다

각 애노테이션에 대한 설명들은 

구선생에 참 잘 나오더라구요-_-

이것으로 오늘의 학습을 마치도록 하겠습니다

그럼 이만-_-

반응형
LIST