-
[Kotlin] @JvmStatic이란?Kotlin/Kotlin 2022. 10. 28. 00:01728x90
개요
Junit5의 @ParameterizedTest를 사용하면서 @MethodSource를 사용하던 중 다음과 같은 에러가 발생했습니다.
org.junit.platform.commons.JUnitException: Could not find factory method
이때 Companion Object에 @JvmStatic 키워드를 붙여서 해결할 수 있었습니다.
https://stackoverflow.com/questions/57054115/use-pure-kotlin-function-as-junit5-methodsource
간단하게 설명하자면 Kotlin에서는 @JvmStatic 어노테이션을 활용해 companion object를 정적(static) 메서드로 만들 수 있습니다.
Companion Object와 @JvmStatic
companion object를 활용하여 자바의 static과 유사하게 사용했지만 사실 내부 동작은 다릅니다.
class Bar { companion object { var barSize : Int = 0 } }
위의 코드를 자바 코드로 바꾸면 다음과 같습니다.
public final class Bar { private static int barSize; public static final class Companion { public final int getBarSize() { return Bar.barSize; } public final void setBarSize(int var1) { Bar.barSize = var1; } } }
barSize는 static 하지만 getter, setter는 static하지 않습니다.
class Bar { companion object { @JvmStatic var barSize : Int = 0 } }
@JvmStatic을 활용한 코드를 변환하면 다음과 같습니다.
public final class Bar { private static int barSize; public static final int getBarSize() { return barSize; } public static final void setBarSize(int var0) { barSize = var0; } public static final class Companion { public final int getBarSize() { return Bar.barSize; } public final void setBarSize(int var1) { Bar.barSize = var1; } } }
@JvmStatic와 Java, Kotlin 상호운영
object Utils { fun printAll(list: List<String>) { println(list) } val version = "v0.0.1" }
Utils object가 있게 되면 kotlin에서는 다음과 같이 접근할 수 있습니다.
fun main() { Utils.printAll(listOf("a", "b", "c")) println(Utils.version) }
하지만 이렇게 되면 Java에서는 @JvmStatic이 없으면 접근할 수 없게 됩니다.
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을 활용할 수 있습니다.
object Utils { @JvmStatic fun printAll(list: List<String>) { println(list) } @JvmStatic val version = "v0.0.1" }
이제 Kotlin과 Java가 완전히 상호작용합니다.
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 }
출처
https://velog.io/@suev72/JvmStatic%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C
https://github.com/occidere/TIL/issues/156
'Kotlin > Kotlin' 카테고리의 다른 글
Kotlin과 Java의 컴파일 순서 (0) 2023.11.11 [Kotlin] 상태패턴으로 배송상태를 변경해보자 (0) 2023.08.29 [Kotlin] Result란? (0) 2022.12.04 [Kotlin] 연산자 오버로딩 사용 예시 (0) 2022.11.25 [Kotlin] Intellij 에서 코틀린 시작하기 (0) 2022.09.09