이전까지 코틀린(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로 인해 코틀린에서
안전 호출 연산자 처리가 가능해집니다
위의 코드에서 여러 애노테이션들을 사용하고 있는데
애노테이션들에 대한 설명들은 생략하겠습니다
각 애노테이션에 대한 설명들은
구선생에 참 잘 나오더라구요-_-
이것으로 오늘의 학습을 마치도록 하겠습니다
그럼 이만-_-
'Android' 카테고리의 다른 글
[Android] 코틀린(Kotlin)의 실체화(Reification)와 확장(Extension) (0) | 2020.06.07 |
---|---|
[Android] 코틀린(Kotlin) 제네릭(Generic) (0) | 2020.05.17 |
[Android] 코틀린(Kotlin) sealed 클래스, 추상클래스, 인터페이스 (0) | 2020.05.08 |
[Android] 코틀린(Kotlin) 다른 타입의 클래스(Class) (0) | 2020.05.04 |
[Android] 코틀린(Kotlin) 클래스(Class)의 상속(Inheritance)와 타입(Type) (0) | 2020.05.04 |