Menu
Coddy logo textTech

보조 생성자

Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 5번째.

클래스는 보조 생성자를 사용하여 생성되는 추가 방법을 제공할 수 있으며, constructor로 선언합니다. 각 보조 생성자는 this(...)를 사용하여 주 생성자를 호출해야 합니다:

class Temperature(val celsius: Double) {
    constructor(fahrenheit: Int) : this((fahrenheit - 32) * 5 / 9.0)
}

main 내부에서:

println(Temperature(20.0).celsius)
println(Temperature(212).celsius)

출력:

20.0
100.0

기본 인수는 보조 생성자를 불필요하게 만드는 경우가 많습니다. 기본값이 있는 주 생성자 하나를 우선 사용하고, 입력 형태가 텍스트를 파싱하는 것처럼 다른 경우에는 보조 생성자를 사용하세요:

class Color(val r: Int, val g: Int, val b: Int) {
    constructor(gray: Int) : this(gray, gray, gray)
    constructor(hex: String) : this(hex.substring(0, 2).toInt(16), hex.substring(2, 4).toInt(16), hex.substring(4, 6).toInt(16))

    fun label() = "rgb($r, $g, $b)"
}

main 내부에서:

println(Color(128).label())
println(Color("FF8000").label())

출력:

rgb(128, 128, 128)
rgb(255, 128, 0)

주 생성자와 그 init 블록이 먼저 실행된 다음 보조 생성자의 본문이 실행됩니다:

class Log(val name: String) {
    init { println("primary: $name") }
    constructor(id: Int) : this("log-$id") {
        println("secondary: $id")
    }
}

main 내부:

Log(7)

출력:

primary: log-7
secondary: 7

생성자는 모든 오버로드에서 모호함 없이 작동해야 합니다. 매개변수 타입이 동일한 두 생성자는 허용되지 않으며, 여러 생성자와 일치할 수 있는 호출은 컴파일되지 않습니다.

class Size(val w: Int, val h: Int) {
    constructor(side: Int) : this(side, side)   // Size(3) -> 정사각형
    // constructor(w: Int) : this(w, 1)        // 오류: 위와 동일한 시그니처
}
challenge icon

챌린지

쉬움

Duration(val seconds: Int) 클래스를 보조 생성자 (minutes: Int, seconds: Int)와 1:30 또는 2:05:10(시:분:초)과 같은 텍스트를 받는 또 다른 생성자로 완성하세요. 두 자리 분과 초를 사용하여 h:mm:ss를 반환하는 format()을 추가하세요.

제공된 코드는 하나 또는 두 개의 콜론이 포함된 텍스트로 기간을 읽고, 텍스트 생성자를 사용하여 각각을 만든 다음 format()을 출력합니다. 그런 다음 total 과 형식이 지정된 합계를 출력합니다.

코드는 Duration.kt에 작성하세요. Main.kt에는 제공된 입력/출력 코드가 포함되어 있으며 수정할 수 없습니다.

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    var total = 0
    for (line in input) {
        val d = Duration(line)
        println(d.format())
        total += d.seconds
    }
    println("total " + Duration(total).format())
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Kotlin 플레이그라운드