[Kotlin] 싱글톤(Singleton) 객체 사용

문승연·2023년 7월 31일
0

Kotlin 기본

목록 보기
4/11

이 포스트는 아래의 Android 공식 홈페이지에서 제공하는 Codelab을 기반으로 작성되었습니다.
https://developer.android.com/codelabs/basic-android-kotlin-compose-generics?hl=ko#0

개발을 하다 보면 클래스에 인스턴스가 단 하나만 포함되기를 바라는 경우가 발생한다.
1. 현재 사용자를 대상으로 한 모바일 게임의 플레이어 통계
2. 단일 하드웨어 기기와 상호작용(ex. 스피커를 통해 오디오 전송)
3. 원격 데이터 소스(ex. Firebase 데이터베이스)에 액세스하는 객체
4. 한 번에 한 사용자만 로그인해야 하는 인증

위의 예시의 경우 클래스를 정의하고 해당 클래스의 인스턴스를 단 하나만 인스턴스화 하면 된다. 오히려 인스턴스가 2개 이상 존재하면 이상한 동작이나 버그가 발생할 수 있다. (하나의 하드웨어 기기에 동시에 2개의 객체가 액세스한다고 가정해보자. 화면이 바뀔때마다 볼륨 설정 값이 변하는 등의 현상이 발생할 수 있다.)

싱글톤 객체 정의

object 문법은 class 문법과 비슷하다. class 키워드 대신 object 키워드를 사용하면 된다.

  • 싱글톤 객체는 생성자를 포함할 수 없다. (개발자가 인스턴스를 직접 생성할 수 없음)
  • 싱글톤 객체의 모든 속성은 중괄호 안 (class body 1)에서 정의되며 초깃값이 부여된다.

이전 포스트의 예시에 나온 [Question]에 대해 학생이 지금까지 답변할 질문의 수를 추적하는 방법을 구현해보자. 이 클래스는 하나만 있으면 되므로 싱글톤 객체로 선언한다.

object StudentProgress { 
	var total: Int = 10
    var answered: Int = 3
}

싱글톤 객체에 액세스

싱글톤 객체의 인스턴스는 개발자가 직접 생성할 수 없다. 따라서 [싱글톤 이름].[속성 이름] 의 점 연산자 방식을 통해 싱글톤 객체의 속성 값에 액세스 한다.

fun main() {
    ...
    println("${StudentProgress.answered} of ${StudentProgress.total} answered.")
}

객체를 companion 객체로 선언

Companion 객체를 사용하여 다른 클래스 내에서 싱글톤 객체를 정의할 수 있다. Companion 객체를 사용하면 클래스 내에서 속성과 메소드를 액세스할 수 있으므로(객체의 속성과 메소드가 해당 클래스에 속한 경우) 문법이 더 간결해진다.

퀴즈 질문을 저장할 [Quiz]라는 새 클래스를 만들고 [StudentProgress] 클래스를 [Quiz] 클래스의 Companion 객체로 만든다.

class Quiz {
    val question1 = Question<String>("Quoth the raven ___", "nevermore", Difficulty.MEDIUM)
    val question2 = Question<Boolean>("The sky is green. True or false", false, Difficulty.EASY)
    val question3 = Question<Int>("How many days are there between full moons?", 28, Difficulty.HARD)
	
    companion object StudentProgress {
        var total: Int = 10
        var answered: Int = 3
    }
}
fun main() {
    println("${Quiz.answered} of ${Quiz.total} answered.")
}
profile
"비몽(Bemong)"이라는 앱을 개발 및 운영 중인 안드로이드 개발자입니다.

0개의 댓글