개발새발 - IT 기술블로그
article thumbnail

안녕하세요. 이번 포스팅에서는 JvmStatic이라는 어노테이션이 하는 역할에 대해서 알아보겠습니다.

 

간단한 예제로 결과와 함께 설명드리겠습니다.

 

 


 

 

결론

JvmStatic 어노테이션은 자바 파일에서 코틀린의 함수메서드정적(static) 멤버 처럼 사용하기 위해 존재합니다.

 

 

개요

 

확장함수

 

JvmStatic은 주로 코틀린에서 사용합니다. 

 

위의 결론을 풀어서 설명드리면 한 프로젝트안에 코틀린 파일과 자바 파일이 공존한다고 할 때, 자바 파일에서는 함수의 멤버에 접근하기 위해 함수에게 인자를 전달하는 과정이 필요합니다.

 

 

예를들어 자바에서 객체에 접근할때 일반적으로 아래와 같이 클래스에 접근해 객체의 인자를 가져옵니다.

KotlinClass kotlinClass = new KotlinClass();
kotlinClass.main();

 

하지만 코틀린은 그렇지 않죠. 아래와 같이 곧바로 접근이 가능합니다.

JavaClass().main()

 

코틀린에서 함수는 호출 대상의 객체를 첫번째 인자로 전달받기 때문입니다.

 

그 말인 즉, 코틀린은 JavaClass()를 입력한 순간 JavaClass에 대한 인자가 생성되고 접근 가능한 상태가 된다는 뜻입니다.

 

반대로 자바는 그렇지 않기 때문에 new 라는 키워드를 사용해 생성자(constructor)에 필요한 인자를 전달해주어야 합니다.

 

이것이 코틀린과 자바의 객체 생성 및 초기화 과정에서 차이가 발생하는 '확장함수(extention function)'의 개념입니다.

 

 

본문

 

결국 우리는 자바에서 코틀린의 함수를 인자전달 없이 사용하기 위해(확장함수 처럼 사용하기 위해) @JvmStatic을 사용합니다.

 

Companion Object

코틀린에서 인스턴스 없이 메서드 호출을 목적으로 companion object 키워드를 사용하여 아래와 같이 총 4개의 정적 메서드 및 변수를 생성했습니다.

 

<MainActivity.kt>

companion object {
    @JvmStatic
    fun enableJvmStaticFunction() {
        println("enableJvmStatic")
    }

    fun disableJvmStaticFunction() {
        println("disableJvmStatic")
    }

    @JvmStatic
    val enableJvmStaticVariable = 0

    val disableJvmStaticVariable = 1
}

 

이때 enable로 시작하는 메서드와 변수에는 @JvmStatic을 붙여주었고, 

disalbe로 시작하는 메서드와 변수에는 붙이지 않았습니다.

 

 

결과 확인

JavaClass.java 라는 자바 클래스 하나와, KotlinClass.kt 라는 코틀린 클래스 하나를 생성하여 확인했습니다.

 

 

코틀린 클래스에서는 Companion Object로 생성한 멤버 모두에게 인스턴스 생성 없이 호출이 가능합니다.

 

 

 

하지만 자바에서는 인스턴스의 전달 없이는 enable로 시작하는 함수와 변수에만 접근이 가능하네요.

당연히 JvmStatic 어노테이션을 붙여주어 확장함수의 형태로 만들어주었기 때문이겠죠?

 

 

Companion

그럼 자바에선 JvmStatic 없이는 코틀린의 companion object에 접근하지 못할까요?

 

아래와 같이 클래스.Companion을 입력하면 코틀린의 정적 멤버에 접근이 가능합니다.

 

 

 

 

자바와 코틀린의 정적 멤버와 객체 접근에 관해 알아보았는데요.

 

코틀린을 개발할 때 JvmStatic을 사용하여 자바와의 상호 운용성도 증가시키고, 함수 호출도 편리하게 하실 수 있었으면 좋겠습니다.

 

 

감사합니다.