출처 - 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;
}
'Kotlin' 카테고리의 다른 글
Kotlin - 소리 재생하기(MediaPlayer ,SoundPool 클래스, 버전분기) (2) | 2019.01.05 |
---|---|
Kotlin - 체인모드(ContraintLayout) (2) | 2019.01.05 |
Kotlin - 앱 위젯 만들기 (2) | 2019.01.05 |
Kotlin - 서비스( Service ) (2) | 2019.01.05 |
Kotlin - 프래그먼트 생성 (0) | 2019.01.05 |
댓글