2024. 1. 31. 16:01ㆍ프로그래밍 언어/Kotlin
안드로이드 스튜디오 개발자 페이지를 기반으로 작성됨.
https://developer.android.com/courses/pathways/android-basics-compose-unit-1-pathway-1?hl=ko
Kotlin 프로그래밍 소개 | Android Basics Compose - First Android app | Android Developers
Kotlin에서 Android 앱 빌드를 준비하기 위해 Kotlin의 입문 프로그래밍 개념을 알아봅니다.
developer.android.com
이번 블로그에서는 객체지향언어에서 종종 쓰이는 Singletone Object에 대해서 소개해보도록 한다.
Singleton Object
Singletone pattern이라고도 많이 불리는 Singleton Object는 객체를 1개만 생성하는 디자인 패턴이다.
일반적인 Class의 경우 특정 틀을 만들고, 객체를 여러 개 인스턴스화 시켜서 사용하지만 Singleton pattern의 경우 하나의 인스턴스만을 사용하게 된다.
Singleton Pattern을 사용할 수 있는 시나리오는 다음과 같다.
- 단일 하드웨어 기기와 상호작용
- 원격 데이터 소스에 액세스하는 객체
- 한 번에 한 사용자만 로그인해야 하는 인증
위와 같은 시나리오 속에서는 객체가 여러 개 인스턴스화 되면, 원하는 동작에 버그가 생길 수 있다. 따라서 코드 상에서 인스턴스가 하나만 있어야 함을 알리도록 명확하게 전달해야 하는데, 다음과 같이 컴파일러에게 알릴 수 있다.
object objectName {
// class body
}
class와 굉장히 유사한 문법이다. class 대신에 object를 사용해주면 된다.
Singleton Object가 인스턴스를 만들지 못하기 때문에 생기는 class와의 차이점은 다음과 같다.
- 생성자를 포함할 수 없다. 따라서 모든 Property가 body안에 정의되고 초깃값이 부여된다.
- 참조를 할 때에 objectName에 대해서 직접적으로 참조를 진행한다. 객체를 만드는 과정이 없기 때문에 특정 객체명 혹은 변수명에 대해서 참조를 할 수 없다.
이제 사용하는 방식에 대해서 한 번 살펴보자.
object StudentProgress {
var total: Int = 10
var answered: Int = 3
}
fun main () {
println("${StudentProgress.answered} of ${StudentProgress.total} answered.")
// 3 of 10 answered.
}
앞서 설명한 것과 같이 main 문에서 object에 대해서 참조를 진행하기 위해서는 object명 자체로 참조를 진행해주면 된다.
Companion Object
Singleton Object는 앞서 설명한 방식 이외에도 다른 클래스 내부에 정의하여 구성될 수 있다. Companion Object를 활용하여 다른 클래스 내부에 Singleton Object로 작용할 수 있으며, 이는 자바에서 사용되는 static과 유사한 개념이다. 즉 클래스 내부에서 공통적으로 사용되는 정적 Property, Method라고 해석할 수 있다.
다만 자바에서 사용되는 static과의 차이점도 분명 존재한다. 차이점은 다음과 같다.
- 하나의 클래스 안에는 하나의 Companion Object만 존재할 수 있다.
- Companion Object로 객체이기 때문에 변수로 할당할 수 있다.
- 클래스에서는 Companion Object의 변수를 사용할 수 있지만 그 반대는 해당하지 않는다. 이유는 Companion Object는 클래스 로딩 시 생성되지만, 클래스 멤버 변수는 인스턴스화 할 때 생성되기 때문에 Companion Object에서 사용할 수 없다.
코드를 통해 사용 방법 및 특징에 대해서 알아보자.
class Quiz {
...
// companion object는 클래스 안에서 하나만 존재함
companion object StudentProgress {
var total: Int = 10
var answered: Int = 3
}
}
fun main() {
// companion object로 변수를 만들 수 있음
val studentProgress = Quiz.StudentProgress
println("${studentProgress.answered} of ${studentProgress.total} answered")
// 클래스 안에서 companion object의 변수들을 참조할 수 있음
println("${Quiz.answered} of ${Quiz.total} answered")
}
companion object는 Android Programming에도 많이 사용되는 개념이니 숙지하고 있는 것이 좋다.
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
Kotlin - Interface (2) | 2024.02.02 |
---|---|
Kotlin - Extensions (0) | 2024.02.01 |
Kotlin - 특수 클래스(data class, enum class, sealed class) (1) | 2024.01.30 |
Kotlin - Generic (1) | 2024.01.30 |
Kotlin - 람다 표현식 (0) | 2023.12.18 |