싱글톤(Singleton)

황승현·2023년 12월 7일
0

코틀린 강의 정리

목록 보기
30/36

싱글톤(Singleton)

메모리 전역에서 유일한 객체임을 보장 가능

  • 객체는 자원이 가능한 만큼 생성 가능
  • 각각의 객체는 상이한 위치 정보를 가지고 있어서 저장하는 값도 객체마다 고유함
  • 싱글턴을 활용하면 해당 객체는 메모리 전역에서 유일함이 보장되고, 위치 정보가 고정됨
  • companion, object 키워드로 싱글턴 구현 가능

싱글톤 사용 이유

  • 싱글턴 객체는 전역적으로 활용 가능
    • 다른 클래스에서 쉽게 접근 가능
  • 객체 자원간의 충동 방지 가능
  • 예시
    • 프로그램에서 키보드 객체를 무한하게 제작한다면 입력 순서가 꼬일 수 있음
    • 키보드 객체는 싱글턴으로 제작해서 사용하고 싶을 때 객체를 얻어오는 방식으로 사용됨

싱글톤 예시

  • 객체를 생성하지 않고 클래스 정보에 접근 가능(생성자 호출X)
fun main() {
	// 싱글턴 객체는 클래스처럼 생성하지 않아도 호출 가능
    Bird.fly("참새") //싱글턴 객체의 메서드 실행
}

object Bird { // 싱글턴 객체
    fun fly(name:String) { // String 파라미터를 받으면
        println("${name}가 날아요~") //문구 출력
    }
}
  • 객체를 생성하지 않고, 클래스 정보에 접근 가능(생성자 호출O)
fun main() {
    // 싱글턴 클래스를 생성하지 않고도 객체에 접근 가능
    // 
    var singletonObject1 = MySingletonClass.getInstance(trash = 1)
    singletonObject1.setNum(5)
    println("num값은: ${singletonObject1.getNum()}")

    // singletonObject2에서 num을 10으로 대입
    var singletonObject2 = MySingletonClass.getInstance(trash = 1)
    singletonObject2.setNum(10)

    // singletonObject1의 num이 10으로 출력됨
    // singletonObject1과 singletonObject2는 같은 객체를 공유하기 때문
    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
            // 외부에서 요청왔을때 instance가 null인지 검증
            if(instance == null) {
		            // synchronized로 외부 쓰레드의 접근을 막음
								// 쓰레드는 다음챕터에서 소개합니다!
		            // 쓰레드간의 객체상태 혼돈을 막기위해 사용한다고 이해해주세요
                synchronized(this) {
                    instance = MySingletonClass()
                }
            }
            return instance!!
            
//            엘비스연산자와 뒷장에서배울 scope function을 이용하면
//            아래와같이 더욱 직관적인 코드 작성이 가능합니다
//            return instance ?: synchronized(this) {
//                // also는 호출한 객체를 it으로 넘김
//                // instance가 null이라면 새로 생성하고 아니면 무시함
//                instance ?: MySigletonClass().also {
//                    instance = it
//                }
//            }
        }
    }
    fun setNum(num: Int) {
        this.num = num
    }

    fun getNum(): Int{
        return this.num
    }
}

0개의 댓글