실무 프로젝트로 배우는 Kotlin & Spring/JAVA 프로젝트에 코틀린 도입하기

JvmStatic을 이용해 정적 함수 호출하기

webmaster 2022. 10. 23. 19:01
728x90

JvmStatic을 이용해 정적 함수 호출하기

Kotlin의 동반 객체, 싱글톤 객체의 메서드

class HelloClass {
    //동반 객체
    companion object {
        @JvmStatic
        fun hello() = "hello!"
    }
}

//싱글톤 객체
object HiObject {
    @JvmStatic
    fun hi() = "hi!"
}

fun main() {
    val hello = HelloClass.hello()
    val hi = HiObject.hi()

}

JAVA에서 사용하기

public class JvmStaticExample {

    public static void main(String[] args) {
        //String hello = HelloClass.Companion.hello();
        //String hi = HiObject.INSTANCE.hi();//객체를 생성하는 INSTANCE를 사용해서 생성후 사용해야한다,
        //@JvmStatic을 사용하게 되면, 자바에서 static 메서드를 호출하듯이 호출할 수 있다
        HelloClass.hello();
        HiObject.hi();
    }
}
  • 동반 객체와 object 키워드로 정의한 싱글톤 객체에서 정의된 함수를 코틀린에서 사용하면, JAVA의 static과 유사하게 사용할 수 있다.
  • JAVA에서 이를 사용하기 위해서는 클래스.Companion.메서드(), 클래스. INSTANCE. 메서드()를 통해서 접근해야 한다.
    • 동반 객체는 static inner class, 싱글톤 객체는 JAVA의 싱글톤 객체(매번 값을 생성하는 것이 아닌 INSTANCE에 값을 저장해서 쓴다)로 변환되기 때문이다.
  • @JvmStatic 애노테이션을 사용하면, Kotlin에서 사용하는 것처럼 Companion, INSTANCE 키워드를 매번 붙이지 않고, 바로 프로퍼티에 접근해서 사용할 수 있다.

JvmField로 정적 프로퍼티 호출하기

Kotlin의 동반 객체, 싱글톤 객체의 프로퍼티

class JvmFieldClass {

    companion object {
        @JvmField
        val id = 1234
        const val CODE = 1234
    }
}

object JvmFieldObject {
    @JvmField
    val name = "tony"
    const val FAMILY_NAME = "stark"
}

fun main() {
    val id = JvmFieldClass.id //클래스 지시자로 접근 가능
    val name = JvmFieldObject.name

}

JAVA에서 사용하기

public class JvmFieldExample {

    public static void main(String[] args) {
        //int id = JvmFieldClass.Companion.getId();
        //String name = JvmFieldObject.INSTANCE.getName(); //중간에 Companion, INSTANCE 를통해 접근해야한다.

        int code = JvmFieldClass.CODE; //상수는 바로 접근 가능
        String familyName = JvmFieldObject.FAMILY_NAME;

        int id = JvmFieldClass.id; //@JvmField 애노테이션이 있으면 직접 접근이 가능하다
        String name = JvmFieldObject.name;
    }
}
  • Kotlin은 기본적으로 static 프로퍼티를 지원하지 않는다.
    • 동반 객체와 object 키워드로 정의된 싱글톤 객체를 사용하면 static 프로퍼티와 유사하게 사용할 수 있다.
  • JAVA에서 이를 호출할 경우 마찬가지로 Companion, INSTANCE 키워드를 매번 써야 한다.
  • const 키워드를 사용한 상수는 JAVA static 프로퍼티처럼 사용이 가능하다
  • @JvmField를 사용하면, 상수가 아닌 경우에도 JAVA의 static 프로퍼티처럼 사용이 가능하다.
728x90