Kotlin/Kotlin 프로그래밍
[Kotlin] Kotlin의 싱글톤 패턴(Singleton Pattern)
주 녕
2022. 2. 5. 23:09
728x90
Kotlin으로 프로그래밍을 하다보니 싱글톤에 대한 개념이 정확하게 서있는 것 같지 않아서, 포스팅을 통해 정리해보려고 한다.
우선 Java의 static과의 차이, object와 companion object의 차이를 중심적으로 정리한다.
싱글톤 패턴 (Singleton Pattern)
- 어떤 클래스의 인스턴스는 오직 하나임을 보장하며, 이 인스턴스는 전역에서 접근할 수 있는 디자인 패턴이다.
- 어플리케이션의 시작부터 종료까지 1번의 생성으로 고정된 메모리 영역을 가지므로, 메모리를 효율적으로 사용할 수 있다. (in Android)
Java의 static VS. Kotlin의 object
1. 사용 방법에서의 차이
- Java에서는 싱글톤 패턴을 구현하기 위해 많은 보일러 플레이트 코드가 발생했다.
- 하지만 Kotlin에서는 object 라는 키워드로 간편하게 싱글톤 패턴을 구현할 수 있도록 하였다.
2. 인스턴스의 생성 시점
- Java에서는 호출되는 시점에서 인스턴스가 생성된다.
- Kotlin의 object는 프로세스가 메모리 상에 올라갈 때 곧바로 생성된다.
- == 사용되지 않을 때도 메모리에 인스턴스가 존재
- 해결책 : by lazy - 지연 생성을 통해 호출될 때 메모리 상에 해당 인스턴스가 올라가도록 한다.
object VS. companion object
object
object RetrofitServiceImpl {
private const val BASE_URL = ""
private val retrofit:Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
companion object
class MySingleton private constructor() {
companion object {
private var instance: MySingleton? = null
private lateinit var context: Context
fun getInstance(_context: Context): MySingleton {
return instance ?: synchronized(this) {
instance ?: MySingleton().also {
context = _context,
instance = it
}
}
}
}
}
1. 선언 구조에서의 차이
- object는 클래스 외부에서 선언이 되지만,
- companion object는 클래스 내부에서 선언이 된다.
2. 사용 방법
- object
- object로 선언된 클래스는 별도의 객체 생성없이 바로 호출할 수 있다.
- object는 접근 시점에 하나의 객체만 생성되므로 생성자가 없는 클래스만 사용할 수 있다.
- object를 초기화하기 위해서는 init 블록을 사용하며 처음에만 실행됨
- object 내에 선언된 속성과 함수는 클래스명.(함수/필드)로 호출이 가능함
- companion object
- companion object로 생성한 파라미터가 있는 싱글톤 클래스는 객체를 생성할 수 있다.
- 상속 관계에서 companion 멤버는 가려진다.
- 여러 개의 객체(이름이 다른)를 생성할 수 있지만, 클래스의 메모리 주소값은 동일하다.
- companion object 내에 선언된 속성과 함수는 클래스명/객체명.(함수/필드)로 호출이 가능하다.
reference >
728x90