class Cat(
species: String
) : Animal(species, 4) {
override fun move() {
...
}
}
Animal 이라는 추상클래스를 Cat 이라는 클래스에 상속하는 방법이다.
extends
키워드를 사용않고 :
를 사용class Penguin(
species: String
) : Animal(species, 2) {
private val wingCount: Int = 2
override val legCount: Int
get() = super.legCount + this.wingCount
}
위 상황에서 super.field
와 같이 상속받은 클래스의 필드를 호출할 때 해당 필드에 open
이 붙어있지 않으면 에러가 발생한다.
👏 TIP : 자바와 코틀린 모두 추상 클래스는 인스턴스화 불가!
class Penguin(
species: String
) : Animal(species, 2), Swimable, Flyable {
override fun act() {
super<Swimable>.act()
supse<Flyable>.act()
}
}
Swimable, Flyable 이라는 interface가 존재
super<Type>.함수()
사용interface Swimable {
val swimAbility: Int
}
코틀린에는 위와 같이 backing field 가 없는 프로퍼티를 Interface 에 만들 수 있다.
fun main() {
Derived(300)
}
open class Base(
open val number: Int = 100
) {
init {
println("Base Class")
println(number)
}
}
class Derived(
override val number: Int
) : Base(number) {
init {
println("Derived")
}
}
위 main()
메서드 실행의 결과 값은 어떻게될까?
동작 순서는 이러하다
하지만 하위 클래스에 number 라는 값이 초기화가 이루어지지 않아 100, 300도 아닌 0이라는 값을 표기하게된다.
그러므로 상위 클래스를 설계할 때 생성자 또는 초기화 블록에 사용되는 프로퍼티에는 open 을 피해야 한다.
👍 간략정리
final : override 할 수 없게 한다. default 로 보이지 않게 한다.
open : override 를 허용한다.
abstract : 반드시 override 해야한다.
override : 상위 타입을 오버라이드 하고있다.