본문 바로가기
Kotlin

JUnit5 @JvmStatic

by oncerun 2023. 7. 4.
반응형

 

@BeforeAll, @AfterAll 어노테이션은 @Test 메서드가 실행되기 전에 전, 후로 한 번 실행되어야 하는 메서드를 지정하는 데 사용됩니다.

 

이 메서드는 static이여야 하며, 테스트 클래스 내에서 한 번만 호출됩니다. 

그래서 보통 테스트 환경의 초기화나 설정과 같은 작업을 수행하는 데 사용됩니다.

 

 

자바가 아닌 코틀린을 이용해 테스트를 작성하기 위해선 다음과 같이 지정해야 합니다.

 

import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*

class ExampleTest {

    companion object {

        @BeforeAll
        @JvmStatic
        fun setup() {
            // 테스트 환경의 초기화 또는 설정 작업 수행
        }
    }

    @Test
    fun test1() {
        // 테스트 1 실행
    }

    @Test
    fun test2() {
        // 테스트 2 실행
    }
}

 

 

Companion Object

 

코틀린에는 정적 변수 혹은 메소드가 없고, 대신 패키지 내에 함수를 선언하여 사용할 수 있습니다.

 

실제 코틀린 파일에 정적변수 및 함수를 정의해서 접미사인 kt를 추가하여 접근할 수 있습니다.

 

예를 들어 Foo.kt 파일에 다음과 같이 정의했다면

package foo.bar

const val FOO = "foo"

fun bar() {
	println("bar")
}

 

외부에서 FooKt.FOO, FooKt.bar()와 같이 사용할 수 있는 것이죠.

 

다만 이는 클래스 외부와 내부의 결합도를 낮추는 방법으로 연관된 속성이라면 권유되지 않는 방법입니다.

 

컴패니언 오브젝트는 코틀린에서 클래스에 속한 정적 멤버를 정의하기 위한 특별한 객체입니다.

 

자바에서 클래스 내부에 정적 멤버 변수를 추가할 때 사용하는 것처럼 사용하게 해 줍니다.

 

클래스 내에 companion object 블록으로 감싸서 정의할 수 있습니다.

 

컴패니언 오브젝트는 클래스 내에서 단 하나만 존재할 수 있으며, 이름을 가질 수 있습니다. 

 

일반적으로 컴패니언 오브젝트의 이름은 "Companion"으로 지정됩니다.

 

이렇게 만든 컴패니언 오브젝트는 해당 클래스의 인스턴스와 상관없이 컴패니언 오브젝트의 멤버를 직접 호출할 수 있죠.

 

 

 

 

@JvmStatic

 

"@JvmStatic"는 코틀린 코드를 자바 바이트 코드로 변환할 때 정적 메서드로 표시하기 위한 애노테이션입니다. 

 

Java에서는 클래스의 정적 메서드를 호출할 때 클래스 이름을 사용하여 호출하지만

Kotlin에서는 컴패니언 오브젝트의 멤버를 호출할 때 클래스 이름을 사용하지 않고 직접 멤버 이름을 사용할 수 있습니다.

 

이를 Java에서도 정적 메서드로 호출하기 위해서 @JvmStatic을 사용하는 것입니다.

 

class MyClass {
    companion object {
        @JvmStatic
        fun myStaticMethod() {
            println("This is a static method in the companion object.")
        }
    }
}

 

예시 코드에서 MyClass는 컴패니언 오브젝트를 가지고 있습니다. 코틀린 코드에서는 다음과 같이 호출합니다.

MyClass.myStaticMethod()

 

Java에서 이와 동일하게 호출하게 되면 컴파일 에러가 발생합니다. Java에서는 Kotlin의 컴패니언 오브젝트의 멤버를 직접적으로 호출할 수 없기 때문입니다.

 

코틀린에서 컴패니언 오브젝트의 속성에 접근할 때 MyClass.Companion.xxx로 접근하고, 위 표현식은 축약 표현일 뿐입니다. 

 

 

정리

 

코틀린에서는 클래스의 정적 멤버, 메서드를 정의할 수 있는 방법으로 Companion Object라는 객체를 사용하도록 한다. 이는 객체이기 때문에 할당도 가능할 것이다. 

 

클래스를 인스턴스화하지 않고 클래스의 컴패니언 오브젝트에 접근이 가능한 것으로 봐서 클래스가 메모리 영역에 올라갈 때 동반되어 올라가는 것으로 생각이 된다. (그래서 동반 객체인가?)

 

기본적으로 코틀린에서 자바코드로 변환되는 경우 클래스 내부에 Companion이라는 정적 클래스가 만들어지고 내부에 getter / setter가 생성된다. 

 

컴패니언 오브젝트에 정의한 멤버 및 함수는 Class의 private 한 접근 키워드를 갖도록 정의된다.

 

그래서 자바에서 접근하기 위해선 Bar.Companion.getXXX와 같이 접근해야 한다.

 

이는 코틀린의 object 키워드가 하는 역할을 이해하면 왜 이렇게 변환되는지 느낌이 온다.

 

다만 @JvmStatic를 사용하면 자바에서도 public 하게 접근 가능한 정적 멤버 변수 및 함수가 추가 생성되어 클래스명. 정적키워드로 접근이 가능해진다.

 

JUnit5은 Java의 테스트 프레임워크이기 때문에 이러한 변환이 필요하다는 결론.

반응형

'Kotlin' 카테고리의 다른 글

Using JPA with Kotlin in a Spring Boot Application  (0) 2023.07.05
spring boot, gradle 설정에 kotlin 환경 설정하기.  (0) 2023.07.04
Backing Property  (0) 2023.07.03
Kotlin 테스트 작성을 위한 빌드 업  (0) 2023.01.18
Tip  (0) 2023.01.15

댓글