본문 바로가기
Kotlin

[Kotlin] @JvmStatic

by Nhahan 2025. 3. 20.

@JvmStatic

함수와 프로퍼티에 static 하게 접근할 수 있도록 추가적인 메서드 또는 getter / setter 를 생성한다.

 

object Utils {
    fun printAll(list: List<String>) {
        println(list)
    }

    val version = "v0.0.1"
}

이 object의 함수와 프로퍼티는 kotlin에서는 직접적으로 접근할 수 있다.

fun main() {
    Utils.printAll(listOf("a", "b", "c"))
    println(Utils.version)
}

 

그러나 Java에서는 해당 object의 메서드/변수에 직접적으로 접근할 수 없고, INSTANCE를 통해 접근 가능하다.

public static void main(String[] args) {
    Utils.printAll(Arrays.asList("a", "b", "c")); // compile-error
    System.out.println(Utils.version); // compile-error
 
    Utils.INSTANCE.printAll(Arrays.asList("a", "b", "c")); // ok
    System.out.println(Utils.INSTANCE.getVersion()); // ok
}

 

 

이와 같은 경우에 @JvmStatic을 사용한다면 Java에서도 Kotlin과 동일하게 바로 접근할 수 있다.

object Utils {
    @JvmStatic
    fun printAll(list: List<String>) {
        println(list)
    }

    @JvmStatic
    val version = "v0.0.1"
}
public static void main(String[] args) {
    Utils.printAll(Arrays.asList("a", "b", "c")); // ok
    System.out.println(Utils.getVersion()); // ok

    Utils.INSTANCE.printAll(Arrays.asList("a", "b", "c")); // ok
    System.out.println(Utils.INSTANCE.getVersion()); // ok
}

 

 


 

아래처럼 MessageBroker에 @JvmStatic을 사용 여부에 따른 자바 컴파일 결과를 보면 이해가 쉽다.

object MessageBroker {
    fun clearAllMessages() {
        // 메서드 구현
    }
}

object MessageBroker {
    @JvmStatic
    fun clearAllMessages() {
        // 메서드 구현
    }
}

 

 

@JvmStatic 사용하지 않았을 경우

public final class MessageBroker {
    public static final MessageBroker INSTANCE = new MessageBroker();

    private MessageBroker() {}

    public void clearAllMessages() {
        // 메서드 구현
    }
}

 

 

@JvmStatic 사용한 경우

public final class MessageBroker {
    public static final MessageBroker INSTANCE = new MessageBroker();

    private MessageBroker() {}

    public static void clearAllMessages() {
        INSTANCE.clearAllMessages();
    }

    public void clearAllMessages() {
        // 메서드 구현
    }
}

 

 

'Kotlin' 카테고리의 다른 글

[Kotlin in Action] 5.5 수신 객체 지정 람다: with와 apply  (0) 2025.03.20
[Kotlin] @JvmField와 @JvmStatic의 차이  (0) 2025.03.20
[Kotlin] @JvmField  (0) 2025.03.20
[Kotlin] @JvmOverloads  (0) 2025.03.20
[Kotlin] @JvmName  (0) 2025.03.20

댓글