본문 바로가기
Kotlin

Kotlin - companion object

by 봄석 2019. 1. 5.

출처 - https://www.androidhuman.com/lecture/kotlin/2016/07/10/kotlin_companion_object/


코틀린에는 static이 없다? - companion object

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



자바와 동일한 방식으로 사용하기: companion object

companion object를 사용하면 위에서 나열했던 문제 없이 자바에서 정적 변수/메서드를 사용했던 것과 동일하게 사용할 수 있습니다. 다음은 사용 예를 보여줍니다.

class Foo {

    companion object {

        const val BAR = "bar"

        fun baz() {
            // Do something
        }
    }
}

companion object 내에 선언된 속성과 함수는 {클래스 이름}.{필드/함수 이름} 형태로 바로 호출할 수 있습니다. 즉, 위의 Foo클래스 내 companion object에 선언된 baz() 함수는 다음과 같이 호출 가능합니다.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // ... Something ...

    // Foo.baz() 함수 호출
    Foo.baz()
}

자바에선 저렇게 못 쓰는데요? - @JvmStatic

companion object를 사용하여 위와 같이 구성한 코드를 자바에서 사용하려면 속성 및 함수가 자바의 필드/메서드로 해석되도록 알려주어야 합니다.

const 선언이 되어 있는 속성은 별도 처리가 필요 없이 자바에서도 동일하게 사용 가능하며, 함수는 @JvmStatic 어노테이션을 사용하여 자바에서 정적 메서드로 사용할 수 있게 합니다.

class Foo {

    companion object {

        // 자바에서도 동일하게 Foo.BAR 로 접근 가능
        const val BAR = "bar"

        // 자바에서 정적 메서드(static method)처럼 사용할 수 있도록 함
        @JvmStatic fun baz() {
            // Do something
        }
    }
}

위와 같이 처리해 두면, 자바의 정적 필드 및 메서드를 사용하는 것과 동일하게 사용할 수 있습니다.

public void doSomething(Bundle args) {

    // args 내에 "bar" 키로 정의되어 있는 데이터 추출
    int bar = args.getInt(Foo.BAR);

    // baz() 메서드 수행
    Foo.bar();
}

Primitive type이나 String이 아닌 타입은 어떻게 처리하나요? - @JvmField

const 키워드는 Primitive type과 String 에만 사용 가능합니다. 따라서 이에 해당하지 않는 타입의 객체를 자바에서 정적 필드처럼 사용하려면 @JvmField 어노테이션을 사용해야 합니다.

다음은 Bar 타입의 속성 BAR를 자바의 정적 필드처럼 사용할 수 있도록 @JvmField 어노테이션을 사용한 예를 보여줍니다.

class Foo {

    companion object {
        @JvmField BAR = Bar()
    }
}

class Bar {

}

위와 같이 처리하면 다음과 같이 자바 코드에서 BAR 속성을 정적 필드처럼 사용할 수 있습니다.

public void doSomething(Bundle args) {

    // Foo.BAR 필드 접근
    Bar myBar = Foo.BAR;
}


댓글