object VS companion object
코틀린은 싱글톤 클래스를 생성하기 위해 object declaration이라는 것을 사용한다.
싱글톤 클래스로 선언해야 할 경우에 클래스 명 앞에 class 대신 object를 사용함으로써 싱글톤 클래스를 생성하게 된다.
하지만 공부를 하다보면 companio object라는 것을 볼 수 있다.
object와 companion object는 무엇이 다른지 알아보자.
1. object
object는 크게 2가지로 사용된다.
1. object expression (객체 표현식)
2. object declaration (객체 선언)
- 동반 객체(객체 선언을 클래스 내부에 사용한 것)
여기서 싱글톤 클래스를 생성하기 위해 사용되는 object의 쓰임은 2번째인 object declaration (객체 선언)이다.
그리고 이제 여기서 object와 companion object를 사용할 수 있는데 하나씩 알아보자.
2. object VS companion object
2-1 object
코틀린에서는 클래스 이름앞에 object 키워드를 붙이면 싱글톤 클래스를 만들수 있다.
하지만 이때는 생성자를 호출하지 않는 클래스에서만 사용할 수 있다.
object는 싱글톤 객체이기 때문에 생성자 자체를 사용할 수 없다.
개발자가 원하는 시점에 인스턴스를 생성하는 방식이 아니기 때문에 생성자 파마리터를 전달할 수 도 없기 때문이다.
import android.util.Log
// 싱글톤 클래스를 만들려면 앞에 object 를 붙이면 된다.
object MyObjectSingleton {
fun printMsg(msg: String) {
Log.d("MyObjectSingleton", "msg: $msg")
}
}
2-2 companion object
코틀린에는 기본적으로 static이 존재하지 않는다. 그에 따라 companion object를 통해 package수준의 최상위 함수와 객체선언을 사용할 수 있다.
* 최상위 함수 : Static 메소드를 대신할 수 있는 함수
* 객체선언 : 최상위 함수가 접근할 수 없는 클래스 안에 있는 private 멤버변수에 접근할때 사용하는 객체
package com.example.part3_chapter4
class A private constructor(val name: String) { // 클래스 A의 주 생성자는 private로 접근을 제한
companion object{
val a = "ddddd"
fun bar(): A{
return A("ZERO") //companion object의 bar() 메서드를 통해 private 생성자에 접근 할 수 있다.
}
}
}
class B{
var a = A("ZERO") // 실패, 주 생성자는 private 접근제한자로 설정되어 호출 할 수 없다.
var b = A.bar() // 성공, 동반객체의 bar() 메서드를 통해 private 주 생성자에 접근이 가능하다.
}
*중요
1. 클래스 내에는 companion object를 오직 딱 하나만 선언할 수 있다.
2. companion object는 static클래스변수가 아니라 object 객체이다.
따라서 클래스명.Companion.변수 의 형태로 사용할 수 있다.
즉 companion object는 클래스가 메모리에 적재되면서 함께 생성되는 동반객체인 것이다.
그래서 클래스명.Companion.변수 로 접근할 수 있는 것이고, 이에 대한 축약표현이 단지 클래스명.변수 이기때문에 단순히 static클래스 변수라고 착각이 드는 것이다.
'안드로이드(Kotlin)' 카테고리의 다른 글
Kotlin 코틀린의 Flow (0) | 2023.03.17 |
---|---|
Kotlin 코틀린의 Coroutine (1) | 2023.02.09 |
Kotlin 코틀린의 싱글톤(Singleton) (0) | 2022.08.30 |
Kotlin 코틀린의 object와 class 키워드 (0) | 2022.08.30 |
Kotlin 코틀린의 Retrofit (0) | 2022.08.26 |