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

0