Constructor 와 init
constructor, initializer
Property initalizers
val count: Int = 0
프로퍼트 선언과 동시에 초기화를 진행할 수 있습니다.Initialize blocks
init{
//do something
}
class에 init {..} 블럭을 넣으면 객체 생성시 호출되어 실행됩니다.
init{..} 블럭은 보통 class 내 상단부분에 넣지만, 중간에 넣어도 되며, 여러개를 넣어도 전부 생성시 호출됩니다.
Constructor
class Person(val name: String ) { //primary constructor
constructor (age: Int, address: String) { //secondary constructor
//do something
}
constructor (age: Int, address: String, company: String) { //secondary constructor
//do something
}
}
생성자 역시 class의 객체 생성시 호출됩니다.
Execution order
open class Parent {
private val a = println("Parent.a - #4")
constructor(arg: Unit=println("Parent primary constructor default argument - #3")) {
println("Parent primary constructor - #7")
}
init {
println("Parent.init - #5")
}
private val b = println("Parent.b - #6")
}
class Child : Parent {
val a = println("Child.a - #8")
init {
println("Child.init 1 - #9")
}
constructor(arg: Unit=println("Child primary constructor default argument - #2")) : super() {
println("Child primary constructor - #12")
}
val b = println("Child.b - #10")
constructor(arg: Int, arg2:Unit= println("Child secondary constructor default argument - #1")): this() {
println("Child secondary constructor - #13")
}
init {
println("Child.init 2 - #11")
}
}
위 코드를 Child(1)을 넣어서 수행하면 가장먼저 secondary constructor의 arguments부터 초기화가 진행됩니다.
결과는 아래와 같습니다.
Child secondary constructor default argument - #1
Child primary constructor default argument - #2
Parent primary constructor default argument - #3
Parent.a - #4
Parent.init - #5
Parent.b - #6
Parent primary constructor - #7
Child.a - #8
Child.init 1 - #9
Child.b - #10
Child.init 2 - #11
Child primary constructor - #12
Child secondary constructor - #13
상속관계 있다면, 부모 클래스의 모든 property, init block, constructor가 생성된 후에 자식 클래스가 초기화 진행됩니다.
따라서 부모 클래스에서 override된 자식 클래스의 함수를 호출하고, 이 함수 내부에 자식클래스의 property에 접근하고 있다면 NPE가 발생하겠죠?
원문: https://medium.com/keepsafe-engineering/an-in-depth-look-at-kotlins-initializers-a0420fcbf546
'개발이야기 > Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 - 코루틴#2 취소와 Timeout (0) | 2018.12.04 |
---|---|
[Kotlin] 코틀린 - 코루틴#1 기본! (3) | 2018.12.03 |
[Kotlin] 코틀린 Generic #1 (1) | 2018.05.12 |
[Kotlin] 코틀린 High order function (0) | 2018.05.09 |
[Kotlin] 코틀린 연산자 오버로딩 #2 컬렉션, in, rangeTo, iterator, destructuring, Property delegation, by (0) | 2018.05.06 |