본문 바로가기

안드로이드/Kotlin

[Kotlin] 생성자

코틀린의 생성자는 constructor()를 사용하여 만들 수 만들 수 있습니다.

Java에서 클래스이름을 사용하던 것을 constructor로 바꾸면 끝입니다.

 

class Student {
    var name = ""
    var score = 0

    constructor(name: String, score: Int) {
        this.name = name
        this.score = score
    }
}

fun main() {
    var st1 = Student("강지훈", 33)
}

 

타 언어와 다르지 않은 생성자 선언 방식입니다.

 

 

하지만 여기서 더 나아가서 다른 방식으로도 만들어 줄 수도 있습니다.

 

우선, Kotlin에는 생성자에는 주생성자와 부생성자 두 종류가 있다는 것과, constructor가 부생성자라는 것을 알아야 합니다.

그렇다면 주생성자는 어떻게 선언하는지 코드로 보겠습니다.

 

class Student constructor(name: String, score: Int) {
    var name = ""
    var score = 0
}

fun main() {
    var st1 = Student("강지훈", 33)
}

 

코드로 보다시피, 주생성자는 클래스 옆에 괄호를 추가해서 만들 수 있습니다.

추가로 클래스 옆의 constructor는 생략이 가능하고, 보통 그렇게 사용합니다.

 

하지만 위의 코드는 어딘가 허전합니다.

객체를 생성하여 생성자로 파라미터를 받아오기는 했는데 막상 멤버 변수 this.name과 this.score에 대입할 수가 없어졌습니다.

 

 

그래서 init을 사용합니다.

init을 사용한 코드도 보겠습니다.

 

class Student constructor(name: String, score: Int) {
    var name = ""
    var score = 0

    init {
        this.name = name
        this.score = score
    }
}

fun main() {
    var st1 = Student("강지훈", 33)
}

 

이렇게 init키워드를 사용하여 멤버변수에 파라미터 값을 넣을 수 있습니다.

 

 

하지만 init을 쓰지 않고 오히려 간단하게 주생성자를 이용할 수 있습니다.

 

class Student constructor(var name: String, var score: Int) {

}

fun main() = with(System.`in`.bufferedReader()) {
    var st1 = Student("강지훈", 33)
}

 

위 코드는 생성자에서 파라미터를 받음과 동시에 멤버 변수로 선언한 코드입니다.

이 형태를 마지막으로 주생성자와 부생성자의 형태를 전부 보았습니다.

 


그렇다면 마지막으로 주생성자와 부생성자에는 무슨 차이와 상관이 있는지 더 보겠습니다.

 

우선 constructor는 타 언어의 생성자와 다르지 않다고 하였습니다.

즉 부생성자(constructor)로는 생성자에 대한 오버로딩이 가능합니다.

 

// 주 생성자가 없음.
class Student {
    var name = ""
    var score = 0

    constructor(name: String, score: Int) {
        this.name = name
        this.score = score
    }

    // 생성자 오버로딩
    constructor(name: String) {
        this.name = name
        this.score = 100
    }
}

fun main() = with(System.`in`.bufferedReader()) {
    var st1 = Student("강지훈", 33)
    var st2 = Student("김현진")
}

 

그리고 주석에 적어놨듯이 위 클래스에는 주생성자가 없습니다.

 

 

그렇다면 주생성자가 있는 경우에 생성자를 오버로딩하려면 어떻게 되는지도 보겠습니다.

 

// 주 생성자가 없음.
class Student constructor(var name: String, var score: Int) {
    var num = 0

    // 생성자 오버로딩
    constructor(name: String, score: Int, num: Int) : this(name, score) {
        this.num = num
    }

    /*
    // 잘못된 경우 1 (주 생성자를 상속 받아야 함)
    constructor(name: String, score: Int, num: Int) {
        this.num = num
    }

    // 잘못된 경우 2 (주 생성자를 상속 받고 파라미터로도 받아야 함)
    constructor(num: Int) : this(name, score) {
        this.num = num
    }
    */
}

fun main() = with(System.`in`.bufferedReader()) {
    var st1 = Student("강지훈", 33)
    var st2 = Student("김현진", 100, 1)
}

 

주 생성자가 있는 경우에 생성자를 오버로딩 하려면 위와 같이 조건을 맞춰줘야 합니다.

부 생성자는 주 생성자를 상속 받아야 하고, 주 생성자가 갖고 있는 파라미터를 똑같이 가져줘야 합니다.

'안드로이드 > Kotlin' 카테고리의 다른 글

[Kotlin] 조건문  (0) 2024.04.30
[Kotlin] 변수와 상수  (0) 2024.04.22
[Kotlin] 문법 기초  (0) 2024.04.21
[Kotlin] Log 사용하기  (0) 2024.04.17
[Kotlin] 빠른 입출력  (0) 2023.01.05