@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 |
댓글