본문 바로가기
프로그래밍 놀이터/Kotlin, Coroutine

[Kotlin] initializer 이야기

by 돼지왕 왕돼지 2018. 1. 19.
반응형

 [Kotlin] initializer 이야기


https://medium.com/keepsafe-engineering/an-in-depth-look-at-kotlins-initializers-a0420fcbf546


constructor, default argument, init block, initializer override, Kotlin, kotlin initializer, property initializer, subclass construct, Super, Super Class, superclass construct, top to bottom, [Kotlin] initializer 이야기, 순서


-

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 에 왜 관심을 가지게 되었는지를 보여줍니당 )




반응형

댓글