이 포스트는 아래의 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 키워드를 사용하면 된다.
이전 포스트의 예시에 나온 [Question]에 대해 학생이 지금까지 답변할 질문의 수를 추적하는 방법을 구현해보자. 이 클래스는 하나만 있으면 되므로 싱글톤 객체로 선언한다.
object StudentProgress {
var total: Int = 10
var answered: Int = 3
}
싱글톤 객체의 인스턴스는 개발자가 직접 생성할 수 없다. 따라서 [싱글톤 이름].[속성 이름] 의 점 연산자 방식을 통해 싱글톤 객체의 속성 값에 액세스 한다.
fun main() {
...
println("${StudentProgress.answered} of ${StudentProgress.total} answered.")
}
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.")
}