CS/Kotlin

[Kotlin] 생성자 종류

lovelyunsh 2023. 12. 5. 20:39

생성자

주 생성자와 부 생성자 2가지 종류가 있음.

 

아무 생성자도 생성하지 않으면 기본 생성자가 만들어짐.

 

주 생성자

class Developer(_id: Int) {
    var id: Int = _id
}

주 생성자는 클래스명 옆에 이름을 붙여서 사용가능.

 

여기서 프로퍼티에 타입은 추론이 가능하므로 생략 할 수 있다.

// 추론 가능하니깐 프로퍼티에 타입 제거 가능
class Developer(_id: Int) {
    var id = _id
}

 

 

단순히 프로퍼티만 있다면 프로퍼티도 생략 해도 된다.

// 아예 프로퍼티까지 생략 할 수 있음.
class Developer(var id: Int) {
}

 

 

실제로 생성되는 코드는 아래와 같다.

// 실제 내부적으로 생성되는 코드
class Developer constructor(id:Int){
    var id: Int
    init {
        this.id = id
    }
}

 

init 메서드는 클래스가 인스턴스화가 완료된 후 바로 실행되는 특수 블록이다.

 

 

디폴트 값도 지정 할 수 있음.

// 디폴트 값 생성도 가능.
class Developer(var id: Int, val x: Int = 0, val y: Int = 0)

fun main(args: Array<String>) {
    val developer1 = Developer(100)
    val developer2 = Developer(101, 10, 10)
    
    
    println("developer1 : ${developer1.id} (${developer1.x}, ${developer1.y})")
    //developer1 : 100 (0, 0)
    
    
    println("developer2 : ${developer2.id} (${developer2.x}, ${developer2.y})")
    //developer2 : 101 (10, 10)
}

 

 

부 생성자

부 생성자는 constructor 키워드를 이용해 만들 수 있다. (자바의 생성자와 비슷함)

// constructor 키워드 사용

class Developer {
    var id: Int = 0
    var text: String = ""

    constructor(id: Int) {
        this.id = id
    }
    constructor(id: Int, text: String) {
        this.id = id
        this.text = text
    }
}

 

주 생성자와 부 생성자를 함께 사용할 경우

부 생성자에서 주 생성자를 반드시 호출 해야 한다.

// 주생성자와 부생성자를 함께 쓸 경우
// 부생성자에서 주생성자를 호출해야만 함
class Developer(var id: Int) {
    var text: String = ""

    constructor(id: Int, text: String): this(id) { //this(id) 가 주생성자 호출
        this.text = text
    }
}

 

부 생성자에서 부 생성자를 호출하는 방식도 가능하지만, 마지막으로 호출되는 부 생성자에는 주 생성자를 호출 해야한다.