Menu
Coddy logo textTech

super와 생성자

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

super.method()는 오버라이드 내부에서 상위 클래스 버전의 메서드를 호출합니다. 서브클래스는 상속된 동작을 대체하는 대신 확장할 수 있습니다:

open class Notification(val text: String) {
    open fun render() = "[info] $text"
}
class Reminder(text: String, val minutes: Int) : Notification(text) {
    override fun render() = super.render() + " (in $minutes min)"
}

main 내부에서:

println(Notification("backup done").render())
println(Reminder("meeting", 10).render())

출력:

[info] backup done
[info] meeting (in 10 min)

모든 서브클래스는 슈퍼클래스 생성자를 호출해야 합니다. 기본 생성자를 사용하는 경우 호출은 헤더의 일부인 : Base(arguments)이며, 인수는 서브클래스의 매개변수에서 계산할 수 있습니다:

open class Product(val name: String, val price: Int)

class Discounted(name: String, price: Int, val percent: Int) :
    Product(name, price * (100 - percent) / 100)

main 내부에서:

val tea = Discounted("tea", 500, 10)
println("${tea.name} ${tea.price} (${tea.percent}% off)")

출력:

tea 450 (10% off)

생성은 계층 구조의 위에서 아래로 진행됩니다. 슈퍼클래스의 프로퍼티 초기화 구문과 init 블록이 먼저 실행되고, 그다음 서브클래스의 구문이 실행됩니다.

open class Base(name: String) {
    init { println("Base init for $name") }
}
class Child(name: String) : Base(name.uppercase()) {
    init { println("Child init for $name") }
}

main 내부에서:

Child("kit")

출력:

Base init for KIT
Child init for kit

기본 생성자가 없는 클래스는 각 보조 생성자에서 super(...)를 사용해 상위 클래스를 호출하거나, this(...)를 사용해 자체 생성자 중 다른 생성자에 위임합니다:

open class Shape(val name: String)

class Rect : Shape {
    val w: Int
    val h: Int

    constructor(w: Int, h: Int) : super("rect") {
        this.w = w
        this.h = h
    }

    constructor(side: Int) : this(side, side)
}

main 내부에서:

val r = Rect(3)
println("${r.name} ${r.w}x${r.h}")

출력:

rect 3x3

슈퍼클래스가 먼저 설정되므로 생성자나 init에서 open 멤버를 호출해서는 안 됩니다. 오버라이드는 서브클래스 자체의 프로퍼티에 값이 할당되기 전에 실행됩니다:

open class Base {
    init { println("Base sees: ${describe()}") }
    open fun describe() = "base"
}
class Child : Base() {
    val label = "child"
    override fun describe() = "label is $label"
}

main 내부:

Child()

출력:

Base sees: label is null
challenge icon

챌린지

쉬움

Notification(text)에는 [info] text를 반환하는 open 메서드 render()가 있습니다. 서브클래스를 완성하세요. Warning의 render()는 텍스트를 대문자로 변환한 [warn] TEXT를 반환하고, minutes도 저장하는 Reminder는 super를 사용하여 슈퍼클래스의 결과 뒤에 (in 10 min)을 붙여 반환해야 합니다.

제공된 코드는 info,text, warn,text 또는 remind,text,10 형식의 줄을 읽고, 하나의 List<Notification>에 해당 객체를 생성한 다음 각 객체에 대해 render()를 출력합니다.

코드는 Notification.kt, Warning.kt 및 Reminder.kt에 작성합니다. Main.kt에는 제공된 입력/출력 코드가 포함되어 있으며 편집할 수 없습니다.

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    val notes = mutableListOf<Notification>()
    for (line in input) {
        val p = line.split(",")
        notes.add(when (p[0]) {
            "warn" -> Warning(p[1])
            "remind" -> Reminder(p[1], p[2].toInt())
            else -> Notification(p[1])
        })
    }
    for (n in notes) println(n.render())
}
quiz icon실력 점검

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

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

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