EnjoyLife

companion object 싱글턴과 커스텀 싱글턴의 차이 본문

안드로이드 개발/개발팁

companion object 싱글턴과 커스텀 싱글턴의 차이

Aiden96 2023. 10. 24. 09:57
//기본싱글턴 1

class MyClass {

    companion object {
        val name: String = "Kotlin"
    }
}

fun main(args: Array<String>) {
    println(MyClass.name) // "Kotlin"
}



//커스텀 싱글턴2

class MySingleton private constructor() {
    companion object {
        private var instance: MySingleton? = null

        fun getInstance(): MySingleton {
            return instance ?: synchronized(this) {
                instance ?: MySingleton().also {
                    instance = it
                }
            }
        }
    }

}

fun main(args: Array<String>) {
    val obj1 = MySingleton.getInstance()
}
 
 

1.안전성: companion object로 싱글턴을 만들 경우, MySingleton 클래스의 생성자가 private가 아니기 때문에, 

다른 쓰레드에서 MySingleton 클래스의 생성자를 호출하여 새로운 인스턴스를 생성할 수 있습니다. 
따라서 여러 쓰레드에서 동시에 MySingleton 클래스의 인스턴스를 참조할 경우, 동일한 인스턴스를 참조하지 않

을 수 있습니다. 하지만 MySingleton 클래스에 private 생성자를 사용하면, 다른 쓰레드에서 MySingleton 클래스의 

인스턴스를 생성할 수 없기 때문에, 항상 동일한 인스턴스를 참조할 수 있습니다.

 

2.유연성: companion object로 싱글턴을 만들 경우, MySingleton 클래스의 인스턴스를 직접 생성할 수
 있기 때문에, 생성자의 인자를 전달할 수 없습니다. 하지만 MySingleton 클래스에 private 생성자를 사용하면, companion object의 getInstance() 메서드를 통해서만 인스턴스를 가져올 수 있기 때문에, 생성
자의 인자를 전달하여 다양한 싱글턴을 구현할 수 있습니다.