12. 싱글톤과 동반 객체 (Object & Companion Object)
코틀린은 귀찮게 싱글톤 패턴(Singleton)을 손수 짤 필요가 없습니다. class 대신 object 키워드만 사용하면, 프로그램 전역에서 단 하나만 존재하는 객체가 즉시 생성됩니다.
또한 자바의 static 멤버(클래스 레벨 변수/메서드)가 코틀린에는 없습니다. 대신 클래스 내부에 companion object를 두어 자바의 static과 완전히 동일한 역할을 하면서도 객체지향적인 유연함을 가져갑니다.
// 1. 싱글톤 선언 (object)
// DataBaseManager는 프로그램 전체에서 단 1개의 인스턴스만 보장됩니다.
object DataBaseManager {
var isConnected = false
fun connect() {
isConnected = true
println("데이터베이스에 연결되었습니다!")
}
}
// 2. 동반 객체 (Companion Object)
class User(val name: String) {
// 클래스 내부의 스태틱 영역 같은 곳입니다.
companion object {
val MAX_AGE = 120 // 공통 상수 (static final 역할)
// 팩토리 메서드 (static 메서드 역할)
fun createGuest(): User {
return User("Guest_001")
}
}
}
fun main() {
// object는 이름 그 자체로 바로 접근합니다. (생성자 호출 안함)
DataBaseManager.connect()
println("연결 상태: " + DataBaseManager.isConnected)
// companion object 멤버는 클래스 이름으로 직접 접근합니다.
println("사람의 최대 수명 한계: " + User.MAX_AGE)
val guest = User.createGuest()
println("환영합니다, " + guest.name)
}