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()
}