객체와 싱글톤
- 싱글톤 디자인 패턴은 가장 이해하기 쉬운 동시에 구현하기 가장 어려운 디자인 패턴?
- 코틀린은 싱글톤일 직접 지원
객체 표현식으로 사용하는 익명 객체
// object.kt
fun drawCircle() {
val circle = object { // an expression
val x = 10
val y = 20
val radius = 30
fun printCalculateCircumference() {
val answer = 2 * radius * 3.14
println("""
Circumference Is 2 * $radius * 3.14
The Answer Is $answer
""")
}
}
circle.printCalculateCircumference()
}
fun main () {
drawCircle()
}
- 코틀린의 객체 표현식은 JS의 객체와 비슷하다.
- 객체 표현식은 object 키워드 이후에 {} 블록이 온다
- 속성을 val로 정의하는 대신 var로 정의해서 뮤터블하게 만들 수도 있다.
- 함수를 추가하는 것 역시 가능하다. → 그냥 클래스를 정의해서 사용하는 편이 좋을 수 있다.
- 익명 객체의 한계
- 익명 객체의 내부 타입은 함수나 메소드의 리턴타입이 될 수 없다.
- 익명 객체의 내부 타입은 함수나 메소드의 파라미터가 될 수 없다.
- 클래스 안에 저장된 속성들이 있다면, 해당 속성들은 Any로 간주 된다. 그러면 모든 속성이나 메소드에 직접 접근은 할 수 없다.
- 짧게 말해서 대부분의 기초적인 객체 표현식은 지역변수들을 그룹핑할 때만 유용하다.
// anonymous.kt
fun createRunnable(): Runnable {
val runnable = object: Runnable {
override fun run() {println("You called...")}
}
return runnable
}
fun main () {
createRunnable().run()
val aRunnable = createRunnable()
aRunnable.run()
}
- 변수 runnable이 익명 내부 클래스의 인스턴스를 참조한다.
- 변수의 타입은 Runnable이다.
객체 선언을 이용한 싱글톤
- object 키워드와 {} 블록사이에 이름을 넣는다면, 코틀린은 이를 표현식이 아니라 명령문 또는 선언으로 인식한다.
- 싱글톤을 만들땐 객체 선언을 사용하자.
- 코틀린에서 싱글톤의 대표적인 예가 Unit이다