[Kotlin + SprintBoot]#3. Java Springboot -> Kotlin Springboot(1)
Getter & Setter
Java에서 Kotlin class의 property를 사용할 땐 기존 Java code와 같이 getter와 setter를 사용한다.
당연하지만 Kotlin property 중 val로 선언한 property의 경우 setter를 사용하여 값을 수정할 수는 없다.
<Kotlin Object>
class Person{
var name: String? = null
val species = "mammal"
}
<Java Code>
public static void main(String[] args){
Person person = new Person()
person.getName()
person.getSpecies()
person.setSpecies("reptile") // 컴파일 오류 발생
}
추가적으로 코틀린에서 var로 선언한 property의 setter를 없애기 위해 아래와 같이 private set을 사용할 수 있다.
이 경우 해당 property는 내부에서만, 혹은 외부 접근 함수를 통해서만 변경이 가능함(일종의 custom setter)
class Person{
var name: String? = null
val species = "mammal"
private set
}
물론 Java에서 Kotlin property를 사용할 때 별도의 getter, setter 언급 없이 Kotlin에서 사용하는 것처럼 할 수 있다.
이 경우, @JvmField 라는 어노테이션을 사용한다.
<Kotlin Object>
class Person{
@JvmField
var name: String? = null
val species = "mammal"
}
<Java Code>
public static void main(String[] args){
Person person = new Person()
System.out.println(person.name)
System.out.println(person.species)
person.name = "minjae"
}
반대로 Kotlin에서 Java object의 property를 사용하고자 할 때는 기존 Java에서 사용하는 방법과 기존 Kotlin에서 사용하는 방법 두 가지를 모두 사용할 수 있다.
<Java Object>
public class Person(){
private String name;
private String speices;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setSpeices(String species){
this.species = species;
}
public String getSpeices(){
return species;
}
}
<Kotlin code>
fun main(){
var person = Person()
// 둘 다 OK
person.setName("minjae")
person.name = "minjae"
}
Exception
Java와 달리 Kotlin에는 checked exception이 존재하지 않는다 -> Java는 try-catch문이나 throw를 통한 예외처리가 필수이지만 Kotlin은 필수가 아님
때문에 Kotlin에서 작성한 check exception을 발생시키는 code를 Java에서 사용하더라도 예외처리가 강제되지 않는다.
checked exception을 발생시키는 모체는 Kotlin이기 때문
하지만 Kotlin에서 작성한 checked exception 발생 code를 Java 상에서 throw하고 싶다만 @Throw 라는 어노테이션을 사용하면 된다.
@Throw 어노테이션 없이 Kotlin exception을 Java에서 try-catch로 처리하려 하면 컴파일 에러가 발생함
<Kotlin code>
class TmpThrow {
@Throws(IOException:class)
fun throwTmpException(){
throw IOException("tmp exception")
}
}
<Java code>
public static void main(String[] args){
TmpThrow tmpThrow = new TmpThrow()
try{
tmpThrow.throwTmpException()
}catch(IOException e){
e.printstacktrace()
}
}
추가적으로 Java와 Kotlin 코드를 같이 운용하는 상황에서, Java에서는 해당 사항이 없지만 Kotlin 내부에서는 이미 예약어로 사용하고 있는 변수가 있을 수 있다.
이 경우 백틱(`) 문자를 통해 감싸줌으로써 문제를 해결한다.
Kotlin의 static method in Java
@JvmStatic 어노테이션을 사용하면 Kotlin의 companion object이나 object keyword로 생성된 singleton object 내부의 method를 Java상에서 statice method처럼 사용할 수 있게 된다.
<Kotlin code>
class tmp1 {
companion object{
@JvmStatic
fun hello = "hello"
}
}
object tmp2{
fun hi = "hi"
}
<Java code>
public static void main(String[] args){
// @JvmStatic이 사용 안됐을 때
// String hello = tmp1.Companion.hello();
// @JvmStatic이 사용됐을 때
String hello = tmp1.hello();
}
Kotlin의 확장함수 in Java
Kotlin에서 정의한 확장함수를 Java 내부에서 사용할 때는
Kotlin에서 사용했던 방법이 아닌, 아래와 같은 방법으로 Kotlin의 확장함수를 사용한다.
public static void main(String[] args){
// TmpExtension.kt라는 파일에 first라는 확장함수가 정의되어있다 가정
System.out.println(TmpExtensionKt.first("minjae", 'k'));
//kminjae 출력
}
Lombok in Kotlin
본인이 경험했던 것과 같이 Java에서는 Lombok에서 제공해주는 어노테이션을 사용하여 자동적으로 getter, setter와 같은 객체 조종에 필요한 기능을 제공받는다.
하지만 Lombok이 제공해주는 어노테이션이 붙은 object를 Kotlin 내부에서 사용할 수는 없다.
이를 해결하기 위한 방법은 두 가지가 있다.
1. Java object에서 사용된 Lombok 어노테이션을 모두 지우고, 손수 getter, setter를 만들어 사용
2. Java object를 Koltin data class로 migration
보통 2번을 많이 택한다고들 함. Kotlin은 자동으로 getter, setter를 제공해주기 때문.