코틀린에서 클래스를 초기화 할 때 실행되는 순서를 정리하려 한다.
init은 클래스를 생성하면 먼저 실행되는 것들 중 하나다.
변수 설정도 같은 종류인데 가장 위에 있는 코드부터 실행된다.
fun main() {
// First value : test
// First init test
// Second value : test
// Second init test
Person("test")
}
class Person(name: String) {
val firstValue = "First value : $name".also(::println)
init {
println("First init $name")
}
val secondValue = "Second value : $name".also(::println)
init {
println("Second init $name")
}
}
부 생성자로 클래스를 생성하면 변수 초기화와 init이 먼저 호출되고 그 다음에 호출된다.
fun main() {
// Value : test
// Init test
// Constructor 10
Person(10)
}
class Person(name: String) {
val firstValue = "Value : $name".also(::println)
constructor(age: Int): this("test") {
println("Constructor $age")
}
init {
println("Init $name")
}
}
부모 클래스가 존재하면 부모 클래스의 코드가 먼저 실행된다.
fun main() {
// Init parent test
// Size parent 4
// Init child test
// Size child 4
Person("test")
}
open class Creature(val name: String) {
init {
println("Init parent $name")
}
open val size: Int = name.length.also { println("Size parent $it") }
}
class Person(
name: String
) : Creature(name) {
init { println("Init child $name") }
override val size: Int = super.name.length.also { println("Size child $it") }
}