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챌린지
쉬움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())
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Kotlin 플레이그라운드