안드로이드 개발/개발팁
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() 메서드를 통해서만 인스턴스를 가져올 수 있기 때문에, 생성
자의 인자를 전달하여 다양한 싱글턴을 구현할 수 있습니다.