PersesTitan(페르) 기술블로그

[Kotlin] 코틀린 기초 - 생성자 순서 (주 생성자, init, 보조 생성자) 본문

Language/Kotlin

[Kotlin] 코틀린 기초 - 생성자 순서 (주 생성자, init, 보조 생성자)

PersesTitan(페르) 2023. 10. 10. 08:01

코틀린의 생성자의 순서는 다음 순서대로 진행됩니다.

  1. 주 생성자
  2. init
  3. 보조 생성자

순서 확인하기

다음 코드를 보시면 init이 실행되고 보조 생성자가 실행된 것을 볼 수 있습니다.

class Test {
    constructor() {
        println("보조 생성자 실행")
    }
    init {
        println("init 실행")
    }
}
fun main() {
    Test()
}

// 출력
// init 실행
// 보조 생성자 실행

 

해당 순서로 인해 발생하는 문제

위 순서로 인해 발생하는 문제는 다음과 같습니다. 보조 생성자에서 값을 초기화 할 경우 init에서 변수를 가져오게 되면 초기화가 되지 않았다고 에러가 발생하는 것이죠.

 

- 해당 코드는 에러가 발생하지 않습니다.

class Test {
    private val a: Int
    constructor(a: Int) {
        this.a = a
    }
}

- 에러가 발생하는 코드

class Test {
    private val a: Int
    constructor(a: Int) {
        this.a = a
    }
    init {
        println(a)
    }
}

// error: Kotlin: Variable 'a' must be initialized

해결 방법

해당 방법을 해결하기 위해서는 변수 선언은 가장 처음에 실행되는 주 생성자에서 변수 선언을 하면 됩니다.

class Test(private val a: Int) {
    init {
        println(a)
    }
}

관련 글

https://persestitan.tistory.com/122

 

[Kotlin] 코틀린 기초 - 접근제어자

public, internal, protected, private이가 존재합니다. 자바와 다르게 kotlin은 접근제어자를 생략했을대 default접근제어자가 아닌 public접근제어자로 설정되어있습니다. kotlin에서는 특이하게 java와 다르게

persestitan.tistory.com

https://persestitan.tistory.com/124

 

[Kotlin] 코틀린 기초 - 클래스 및 생성자 (constructor)

인스턴스화 코틀린은 자바에서 사용하는 new 키워드를 사용하지 않는 특징이 존재합니다. 코틀린은 new키워드가 애초에 예약어로 잡혀있지 않은데 new키워드를 사용하지 않고 클래스명에다가 매

persestitan.tistory.com