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