companion object 을 통해서 알수있는 것 : 어떤 클래스의 모든 인스턴스가 공유하는 객채를 만들고 싶을 때 사용한다.
주의해야할점 : 어떤점이 object 와 다른가? Kotlin – “Object”
–> 컴페니언 오브젝트는 상응하는 클래스가 로드될때 초기화 되서 접근 가능하게 되어있다. (오브젝트는 초기화가 실제로 처음 접근할때 뒤늦게된다(lazy loading- lazy init)
(A companion object is initialized when the corresponding class is loaded. It brings about the ‘static’ essence, although Kotlin does not inherently support static members)
class cotest {
companion object{
fun withoutInterfaceTestFun() = println("the functions in companion object are able to be more ")
}
}
fun accessPoint(){
cotest.withoutInterfaceTestFun()
}
interface Factory<T> {
fun testFun() : T
}
class test {
companion object : Factory<test> {//인터페이스 구현을 한 컴페니언오브젝트
override fun testFun(): test {
TODO("Not yet implemented")
}
}
}
fun main (){
test.Companion
test.testFun()
}
MSA 의 표본인 나의 프로덕의 경우 사실 companion object 을 잘 사용하지 않았다. 클래스에서 사용하는 상수(const)의 경우에도 companion object 에 선언하지 않고 전체 클래스보다 상위에 선언하므로써 서비스 내에 전체에서 접근할수 있었다.
companion object 은 복잡하게 생각할 것도 없이 static 키워드와 같다고 생각하면 된다.
객체의 생성없이 프로퍼티나 메서드에 대한 접근을 가능하게 하고, 접근을 하여 한번 메모리에 올라간 프로퍼티나 메소드를 추가 로드 없이 사용할 수있다.
<참고사항>
클래스 안의 객체 선언은 companion
키워드로 할수있다.
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
또한 컴페니언 오브젝트(companion object – 동반객체)의 맴버는 한정자로써의 클래스이름을 간단하게 사용하는것만으로도 호출할 수 있다.
val instance = MyClass.create()
위에서 사용했던것 처럼 컴페니언 오브젝트(companion object – 동반객체)의 이름은 없이 사용할수있고, 이떄는 외부에서 사용시 Companion
으로 사용할 수있다.
class MyClass {
companion object { }
}
val x = MyClass.Companion
클래스 이름 그자체로(다른 이름의 한정자 없이) 컴페니언 오브젝트(companion object – 동반객체)를 참조하는데 사용될수있다.
class MyClass1 {
companion object Named { }
}
val x = MyClass1
class MyClass2 {
companion object { }
}
val y = MyClass2
컴페니언 오브젝트(companion object – 동반객체)의 멤버는 다른 언어에서 정적 멤버처럼 보이지만 런타임에 여전히 실제 객체의 인스턴스 멤버이며 이것을 인터페이스를 구현할 수 있다.
interface Factory<T> {
fun create(): T
}
class MyClass {
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}
val f: Factory<MyClass> = MyClass
단, jvm 상에서 @JvmStatic
annotation과 함께 쓰일 때는 예외이다
참고 – https://kotlinlang.org/docs/reference/object-declarations.html#object-expressions-and-declarations