-
[Kotlin] Accessing non-final property number in constructorlegacy/Kotlin 2024. 7. 5. 14:36
1. 상위 클래스
open class Base( open val number: Int = 100 ) { init { println("Base Class") println("Base Class number ${number}") } }
2. 상위 클래스를 상속받는 하위 클래스
class Derived( override val number: Int ): Base(number) { init { println("Derived Class") println("Derived Class number : ${number}") } }
3. 하위 클래스를 인스턴스화하기
fun main() { val derived = Derived(1) }
4. 의도와 다른 값
3번에서 하위클래스를 인스턴스화하면 아래의 출력이 발생한다. 이해가 되지 않았던 것은 하위 클래스인 Derived를 인스턴스화하였을 때 상속받고 있는 클래스인 Base의 number가 0으로 출력되는 것이었다.
Base Class Base Class number 0 Derived Class Derived Class number : 1
Derived 인스턴스화하기 위해서는 상위 클래스인 Base를 먼저 생성하여야 한다. Base의 생성자로 number 값으로 1이 들어갔으므로 init 블록에서 1을 출력해야 하지 않지 않나?라는 생각이 들었다.
[상위 클래스] open class Base( open val number: Int = 100 ) { init { println("Base Class") println("Base Class number ${number}") } } [하위 클래스] class Derived( override val number: Int ): Base(number)
5. 값이 달랐던 이유
코틀린에서는 생성자가 호출되기 전에 init 블록부터 호출한다. Base 클래스의 생성자에서 number 프로퍼티에 100을 기본값으로 저장했으나, init 블록이 먼저 호출되었으므로 number 프로퍼티가 초기화되지 못하고 기본값인 0을 갖게 된다.
Base Class Base Class number 0
init 블럭이 호출되고 생성자가 호출되므로 Base 클래스의 number 값에는 1이 저장된다. 따라서 Base 클래스를 상속받는 Derived의 number 값은 1을 갖게 된다.
Derived Class Derived Class number: 1
6. Accessing non-final property number in constructor
init 블록에서 number 프로퍼티에 접근하려고 하지만, 생성자가 호출되기 전이므로 number 프로퍼티는 초기회 되지 않았다. 이런 상황에서 컴파일러가 "Accessing non-final property number in constructor" 경고를 보여준다.