[Kotlin] 싱글톤 객체와 싱글톤 패턴
카테고리: Java + Kotlin
싱글톤(Singleton)
싱글톤은 프로그램 내에서 하나의 인스턴스만 존재하며, 어느 시점에서 호출하든 동일한 인스턴스를 참조하는 것을 말한다. 전통적으로 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나이다.
싱글톤 객체와 싱글톤 패턴
- 싱글톤 객체
Kotlin에서는 싱글톤 객체를 쉽게 정의할 수 있도록 object 키워드를 제공한다. object 키워드는 클래스를 정의할 때 사용되며, 해당 클래스를 하나의 인스턴스만 가지도록 보장한다. 이를 통해 아래와 같이 싱글톤 객체를 간단하게 생성할 수 있다.
object SingletonObject {
var counter: Int = 0
fun printCounter() {
println("Counter: $counter")
}
}
- 싱글톤 패턴
Java와 같은 다른 언어에서는 직접 구현해야 하지만, Kotlin에서는 위와 같이 object 키워드를 사용하여 간단히 구현할 수 있다. 그러나 Java 스타일의 싱글톤 패턴 구현을 Kotlin에서도 할 수 있다. 이 방식은 동기화 처리나 초기화 지연(lazy initialization) 등을 포함할 수 있어, 더 복잡한 요구사항을 만족시킬 때 유용하다.
class Singleton private constructor() {
companion object {
@Volatile
private var instance: Singleton? = null
fun getInstance(): Singleton {
if (instance == null) {
synchronized(this) {
instance = Singleton()
}
}
return instance!!
}
}
}
- 주요 차이점
-
구현 방식
싱글톤 객체: object 키워드로 간단하게 선언.
싱글톤 패턴: 클래스와 정적 메서드로 인스턴스를 관리. -
사용 맥락
싱글톤 객체: 간단한 싱글톤이 필요할 때 사용. 기본적인 싱글톤 구현.
싱글톤 패턴: 더 복잡한 싱글톤 관리가 필요할 때 사용. 초기화 순서나 동기화 등의 추가 요구사항 처리. -
언어적 특성
싱글톤 객체: Kotlin의 언어적 특성에 의해 자동으로 싱글톤이 보장됨.
싱글톤 패턴: 프로그래머가 직접 싱글톤을 보장하는 로직을 작성해야 함.
정적 메소드만 들어가 있는 클래스
Kotlin을 공부하는 과정에서 싱글톤 객체라는 생소한 개념과 정적 메소드(static method)가 없는 상황이 동시에 발생해 혼란을 주곤한다. 또한, 정적 메소드만 있는 클래스를 싱글톤 객체라고 부른다.
이는 정적 메소드만 들어가 있는 클래스를 싱글톤 객체라고 부르는 이유는 그 클래스의 인스턴스가 필요 없기 때문이다. 즉, 클래스의 모든 메소드가 정적 메소드로 정의되어 있어, 클래스 자체가 단 하나의 인스턴스 역할을 한다. 이는 싱글톤 패턴의 “하나의 인스턴스” 개념과 본질적으로 동일한 철학을 공유한다.
따라서, 정적 메소드만 있는 클래스를 싱글톤 객체라고 부른다.