[Kotlin] initializer 이야기
https://medium.com/keepsafe-engineering/an-in-depth-look-at-kotlins-initializers-a0420fcbf546
-
constructor, initializer 등이 있을 때 적용되는 순서를 아는 것이 좋다.
먼저 constructor 의 default argument 가 가장 먼저 적용된다.
그 다음 property initializer 와 init block 이 수행된다. 이 때 수행 순서는 top-to-bottom 으로 정의된 순서대로 수행된다.
그 다음에 constructor 가 수행된다.
-
open class Parent {
private val a = println("Parent.a")
constructor(arg: Unit=println("Parent primary constructor default argument")) {
println("Parent primary constructor")
}
init {
println("Parent.init")
}
private val b = println("Parent.b")
}
class Child : Parent {
val a = println("Child.a")
init {
println("Child.init 1")
}
constructor(arg: Unit=println("Child primary constructor default argument")) : super() {
println("Child primary constructor")
}
val b = println("Child.b")
constructor(arg: Int, arg2:Unit= println("Child secondary constructor default argument")): this() {
println("Child secondary constructor")
}
init {
println("Child.init 2")
}
}
정답을 보기 전에 예상해서 문제를 먼저 풀어보시길!
여기서 Child(1) 을 호출하면.. output 은?
Child secondary constructor default argument
Child primary constructor default argument
Parent primary constructor default argument
Parent.a
Parent.init
Parent.b
Parent primary constructor
Child.a
Child.init 1
Child.b
Child.init 2
Child primary constructor
Child secondary constructor
-
결과를 보면 initializers 는 top-to-bottom 으로 순서데로 수행된다.
constructor 에서 다른 constructor 를 호출하면 해당 constructor 수행이 완료된 후 원래의 constructor 가 수행된다.
superclass 가 완전히 construct 된 후에 subclass 가 construct 된다.
만약 정답을 못 맞추었다면 다시 올라가서 한번 복기(?) 해보시길~~
-
그래서 상속을 위한 class 의 constructor 에서 override 할 수 있는 함수를 호출하는 것은 위험하다.
( 이 부분이 이해가 안 가면 최상단 링크 글을 읽어보세용. 필자가 initializer 에 왜 관심을 가지게 되었는지를 보여줍니당 )
'프로그래밍 놀이터 > Kotlin, Coroutine' 카테고리의 다른 글
[Kotlin] findViewById shows "type inference failed..." (0) | 2018.10.06 |
---|---|
[Kotlin] Parcelable 을 쉽게 만들어보자 (0) | 2018.04.01 |
[Kotlin] Kotlin 의 숨겨진 비용 #3 (0) | 2018.01.18 |
[Kotlin] Kotlin 의 숨겨진 비용 #2 (0) | 2018.01.17 |
[Kotlin] Kotlin 의 숨겨진 비용 #1 (2) | 2018.01.16 |
댓글