싱글톤(Singleton)
메모리 전역에서 유일한 객체임을 보장 가능
- 객체는 자원이 가능한 만큼 생성 가능
- 각각의 객체는 상이한 위치 정보를 가지고 있어서 저장하는 값도 객체마다 고유함
- 싱글턴을 활용하면 해당 객체는 메모리 전역에서 유일함이 보장되고, 위치 정보가 고정됨
- companion, object 키워드로 싱글턴 구현 가능
싱글톤 사용 이유
- 싱글턴 객체는 전역적으로 활용 가능
- 객체 자원간의 충동 방지 가능
- 예시
- 프로그램에서 키보드 객체를 무한하게 제작한다면 입력 순서가 꼬일 수 있음
- 키보드 객체는 싱글턴으로 제작해서 사용하고 싶을 때 객체를 얻어오는 방식으로 사용됨
싱글톤 예시
- 객체를 생성하지 않고 클래스 정보에 접근 가능(생성자 호출X)
fun main() {
Bird.fly("참새")
}
object Bird {
fun fly(name:String) {
println("${name}가 날아요~")
}
}
- 객체를 생성하지 않고, 클래스 정보에 접근 가능(생성자 호출O)
fun main() {
var singletonObject1 = MySingletonClass.getInstance(trash = 1)
singletonObject1.setNum(5)
println("num값은: ${singletonObject1.getNum()}")
var singletonObject2 = MySingletonClass.getInstance(trash = 1)
singletonObject2.setNum(10)
println("num값은: ${singletonObject1.getNum()}")
}
class MySingletonClass private constructor() {
private var num:Int = 0
companion object {
@Volatile private var instance: MySingletonClass? = null
private var trash = 0
fun getInstance(trash: Int): MySingletonClass {
this.trash = trash
if(instance == null) {
synchronized(this) {
instance = MySingletonClass()
}
}
return instance!!
}
}
fun setNum(num: Int) {
this.num = num
}
fun getNum(): Int{
return this.num
}
}