
Singleton 패턴
Singleton 패턴은 애플리케이션 전체에서 단 하나의 객체만 존재하도록 보장하고, 어디서든 그 객체에 접근할 수 있게 설정하는 디자인 패턴이다.
설정 파일 관리(Config), 로깅(Logger), 캐시(Cache) 객체, DB 연결 등 전역에서 공유해야 할 리소스를 생성하고 관리할 때 사용한다.
인스턴스가 단 하나이기 때문에 자원 낭비를 방지하고, 코드도 간결하며, 어디서든 쉽게 접근이 가능하다.
하지만 어디서든 접근할 수 있기 때문에, 사실상 전역 변수와 비슷하여, 단위 테스트 등 특정 상황을 재현하기 어렵고, 모든 서비스가 Singleton 객체를 참조한다면, 나중에 설정 방식을 바꾸기가 어려워 다른 객체로 대체/확장하는 것이 어렵다.
Singleton (using keyword 'object' )
package org.example.singleton
object Database {
val name = "MyDatabase"
fun connect() {
println("$name connection successful!")
}
}
fun main() {
Database.connect()
Database.connect()
}
결과
MyDatabase connection successful!
MyDatabase connection successful!
특징
- 'object' 키워드 하나로 싱글톤 객체를 생성한다.
- 자동으로 인스턴스 하나만 생성되고, 어디서든 접근 가능하다.
Singleton (w. Lazy Initialization)
Singleton은 프로그램 전체에서 단 하나의 객체만 생성하고 싶을 때 사용하는 디자인 패턴이다.
하지만 Logging이나 DB 연결처럼 프로그램 시작 시 바로 만들 필요가 없는 경우도 존재한다.
이럴 때 사용하는 것이 Lazy Initialization이다.
package org.example.singleton
class Logger private constructor() {
companion object {
val instance: Logger by lazy { Logger() }
}
fun log(message: String) {
println("Log: $message")
}
}
fun main() {
val log1 = Logger.instance
val log2 = Logger.instance
log1.log("First message")
println(log1 === log2)
}
결과
Log: First message
true
특징
- private constructor() : 클래스 밖에서는 Logger()를 호출해서 새로운 객체를 만들 수 없다.
- companion object\
- Kotlin에서 클래스 내부에 정적(Static) 객체 역할을 하는 블록
- Singleton 인스턴스를 공유 가능한 전역 객체로 만든다.
- by lazy { ... } : 처음 Logger.instance를 호출하는 시점에 Logger 객체가 생성되며, 그 이후로는 같은 객체를 계속 재사용한다.
Powered By. ChatGPT
'Backend' 카테고리의 다른 글
| [Backend] Template Method 패턴 (1) | 2025.09.03 |
|---|---|
| [Backend] Observer 패턴 (1) | 2025.09.03 |
| [Backend] Bulider 패턴 (1) | 2025.09.03 |
| [Backend] Factory 패턴 (1) | 2025.09.03 |
| [Backend] 객체지향 디자인 패턴 (1) | 2025.09.03 |