static 변수와 정적 팩토리 메서드 등을 만들기 위해선 static 키워드를 사용했었다.
static: 클래스가 인스턴스화 될 때 새로운 값이 복제되는 것이 아닌 정적으로 인스턴스끼리 값을 공유static 대신 companion object를 사용한다.class Person private constructor(
var name: String,
var age: Int
) {
companion object {
private const val MIN_AGE = 0
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
}
}
const
companion object 내 상수에 const 키워드가 없다면 런타임 시에 변수가 할당된다.const 키워드가 있으면 컴파일 시 변수가 할당된다.String에 붙일 수 있다.companion object: 클래스와 동행하는 유일한 오브젝트
interface를 구현할 수도 있다.class Person private constructor(
var name: String,
var age: Int
) {
companion object Factory : Log {
private const val MIN_AGE = 0
fun newBaby(name: String): Person {
return Person(name, MIN_AGE)
}
override fun log() {
// ...
}
}
}
companion object에 유틸성 함수들을 넣어도 되지만 최상단 파일을 활용하는 것을 추천한다.companion object를 가져와 사용하는 법
@JvmStatic 어노테이션을 companion object에 붙여야 한다.Person.Companion.newBaby(”…”)와 같이 동반 객체 이름을 통해 호출할 수는 있다.static 영역에 인스턴스를 만들고 static 메서드를 통해 호출하는 방법을 사용했다.
enum class를 활용하는 방법도 있다.object 키워드를 통해 싱글톤을 쉽게 구현할 수 있다.object Sigleton {
var a: Int = 0
}
fun main() {
println(Singleton.a)
}
new 타입 이름()으로 만들었지만 코틀린에선 object : 타입 이름으로 익명 클래스를 선언할 수 있다.interface Movable {
fun move()
fun fly()
}
fun main() {
moveSomething(object : Movable { // object 키워드 사용
override fun move() {
println("...")
}
override fun fly() {
println("...")
}
})
}
private fun moveSomething(movable: Movable) {
movable.move()
movable.fly()
}