companion object Factory: Log {
private const val MIN_AGE = 0
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
override fun log() {
...
}
}
static
대신 companion object
를 사용
companion object
는 하나의 객체로 간주되어 이름을 붙일 수 있고, interface 또한 구현할 수 있다.
companion object {
@JvmStatic
fun newBaby() {
...
}
}
companion object
에 이름을 붙여주지 않는다면 기본적으로 ClassName.Companion.newBaby()
로 호출해야한다. 이를 ClassName.newBaby()
와 같이 호출하고 싶다면 해당 메서드에 @JvmStatic
을 붙이면 된다.
👏 TIP
- static : 클래스가 인스턴스화 될 때 새로운 값이 복제되는 것이 아니라 정적으로 인스턴스끼리의 값을 공유
- companion object : 클래스와 동행하는 유일한 오브젝트
- 변수에 const 를 붙이면 컴파일변수이다.
object Singleton {
var a: Int = 0
}
위와 같이 표기할 수 있으며 Singleton.a
로 접근 가능하다. 애당초 인스턴스가 하나이기 때문에 가능하다.
👏 TIP
- 싱글톤 : 단 하나의 인스턴스만을 갖는 클래스
fun main() {
moveSomething(object: Movable) {
override fun move() {
println("move")
}
override fun fly() {
println("fly")
}
}
}
private fun moveSomething(movable: Movable) {
movable.move()
movable.fly()
}
코틀린에서는 object: Type
그리고 중괄호로 익명 클래스를 표현한다.