본문 바로가기

코틀린

코틀린: 생성자와 속성 초기화 - 보조 생성자

 보조 생성자(secondary constructor)
보조 생성자는 클래스 블록 안에서 정의합니다. 키워드 constructor를 사용해 보조 생성자를 정의합니다. 실행 순서는 주 생성자(선언되어 있으면)와 init 블록을 실행하고 나서 보조 생성자를 실행합니다. 보조 생성자는 속성을 정의할 수 없기 때문에, 보조 생성자의 형식 인자 이름에는 키워드 val 또는 var 를 붙일 수 없습니다.  

class Person {
    val name:String
    var age:Int
    var isMarried:Boolean

    constructor(name:String, age:Int, isMarried:Boolean) { // 보조 생성자
        this.name = name
        this.age = age
        this.isMarried = isMarried
    }
}

보조 생성자는 여러 개 정의할 수 있지만, 각 보조 생성자의 형식 인자 갯수가 달라야 합니다. 보조 생성자는 형식 인자 갯수가 적은 보조 생성자의 초깃값 위임(delegation)을 사용할 수 있습니다. 생성자 다음에 콜론(:)을 붙이고 this를 사용해 다른 보조 생성자를 호출할 수 있습니다.

class Person {
    val name:String
    var age:Int
    var isMarried:Boolean

    constructor(name:String, age:Int, isMarried:Boolean): this(name, age) { 
        this.isMarried = isMarried
    }
    constructor(name:String, age:Int) { 
        this.name = name
        this.age = age
        this.isMarried = false
    }
}

클래스에서 주 생성자를 선언했다면 어떻게 할까요? 보조 생성자는 주 생성자의 속성 초깃값 위임을 사용해야 합니다. 이때 보조 생성자는 주 생성자에서 초기화하지 않는 속성을 형식 인자로 전달받아야 합니다. 즉, 주 생성자의 속성 갯수와 보조 생성자의 형식 인자 갯수는 달라야 합니다.

class Person (val name:String, var age:Int) {
    var isMarried:Boolean = false
    constructor(name:String, age:Int, isMarried:Boolean): this(name, age) { // 보조 생성자
        this.isMarried = isMarried
    }
}