상속은 클래스를 선언할 때 다른 클래스를 참조해서 선언하는 것이다. 즉, 간단하게 말하면 클래스를 확장하는 개념이다.
따라서 상속 관계에서 상속 대상이 되는 클래스를 상위 클래스라고 하고, 상속 받는 클래스를 하위 클래스라고 한다.
open키워드 사용open class Super { // 상속할 수 있게 open 키워드 사용
}
class Sub: Super() { // Super를 상속받아 Sub 클래스 선언
}
open class Super(name: String) {
}
class Sub(name: Stirng): Super(name) {
}
open class Super(name: String) {
}
class Sub: Super {
constructor(name: String): super(name) {
}
}
상위 클래스에 선언된 변수나 함수를 같은 이름으로 하위 클래스에서 다시 선언하는 것을 오버라이딩이라고 한다.
open class Super {
var superData = 10
fun superFun() {
println("superData값: $superData")
}
}
class Sub: Super() // 별도의 멤버를 선언하지 않고, Super 클래스를 상속받음.
fun main() {
val obj = Sub()
obj.superData = 20
obj.superFun()
}
변수도 오버라이딩 기법으로 재정의할 수 있지만 주로 함수를 재정의하는데 사용한다.
예를 들면, 상위 클래스인 Animal이 있고 Animal 클래스에는 cry()라는 함수가 있다고 가정해보자.
이때 이를 상속받는 Dog클래스와 Cat클래스에서 cry()라는 함수를 재정의(오버라이딩)하여 울음소리를 다르게 할 수 있다.
함수뿐만 아니라 변수도 open키워드와 override키워드를 사용해야 한다.
open class Animal(var name: String, var age: Int){
open fun cry() { // 상속 허용하도록 open 키워드 사용
println("울음 소리")
}
}
class Dog(name: String, age: Int): Animal(name, age){
override fun cry(){ // 재정의하도록 override 키워도 사용
println("왈왈")
}
}
class Cat(name: String, age: Int): Animal(name, age){
override fun cry(){ // 재정의하도록 override 키워도 사용
println("냐옹")
}
}
Reference
Book: 깡샘의 안드로이드 프로그래밍 with 코틀린