728x90
추상 클래스
- Animal이라는 추상클래스를 구현한 Cat, Penguin 클래스
- extends 키워드를 사용하지 않고, : 을 사용한다.
- 상위 클래스의 생성자를 바로 호출한다.
- override를 필수적으로 붙여 주어야 한다.
abstract class Animal (
protected val species: String,
protected val legCount: Int
){
abstract fun move()
}
class Cat (
species: String
) : Animal(species, 4) {
override fun move() {
println("고양이가 사뿐 사뿐 걸어가~")
}
}
- 추상 프로퍼티가 아니라면 상속할 때 open을 꼭 붙여야 한다.
protected open val legCount: Int
- 추상클래스에서 자동으로 만들어진 getter를 override 한다. (상속받을 때)
override val legCount: Int
get() = super.legCount + this.wingCount
- 자바, 코틀린 모두 추상 클래스는 인스턴스화 할 수 없다.
인터페이스
- defalut 키워드 없이 메서드 구현이 가능하다.
- 추상 메서드를 만들 수 있다.
- 인터페이스 구현도 : 을 사용한다.
- 중복되는 인터페이스를 특정할 때, super<타입>.함수 를 사용한다.
- backing field가 없는 property를 interface에 만들 수 있다.
interface Flyable {
fun act() {
println("파닥 파닥")
}
}
interface Swimable {
fun act() {
println("어푸 어푸")
}
}
class Penguin (
species: String
) : Animal(species, 2), Swimable, Flyable {
override fun act() {
super<Swimable>.act()
super<Flyable>.act()
}
}
클래스를 상속할 때 주의할 점
- 상위 클래스를 설계할 때, 생성자 또는 초기화 블록에 사용되는 property에는 open을 피해야 한다.
open class Base (
open val number: Int = 1
){
init {
println("Base Class")
println(number)
}
}
class Derived (
override val number: Int
) : Base(number) {
init {
println("Derived Class")
}
}
// 결과값
Base Class
0
Derived Class
상속 관련 지시어 정리
- final: override를 할 수 없게 한다. default로 보이지 않게 존재한다.
- open: override를 열어준다.
- abstract: 반드시 override를 해야한다.
- override: 상위 타입을 override 하고있다.
정리
- 상속 또는 구현을 사용할 때는 : 을 사용해야 한다.
- 상위 클래스 상속을 구현할 때, 생성자를 반드시 호출해야 한다.
- override를 필수로 붙여야한다.
- 추상 멤버가 아니면 기본적으로 override가 불가능하다.
- open을 사용해주어야 한다.
- 상위 클래스의 생성자 또는 초기화 블록에서 open 프로퍼티를 사용하면 예기치 못한 버그가 생길 수 있다.
728x90