11. 인터페이스와 상속 (Interfaces & Inheritance)
코틀린의 클래스는 기본적으로 상속 불가(final) 상태입니다. 상속을 허용하려면 부모 클래스에 반드시 open 키워드를 붙여야 합니다.
인터페이스는 자바 8과 유사하게 본문이 구현된 디폴트 메서드를 가질 수 있으며, 프로퍼티(추상 변수) 선언도 가능합니다. 다중 상속의 이점을 누리면서 역할과 구현을 깔끔하게 분리할 수 있습니다.
// 1. 인터페이스 정의
interface Flyable {
val maxSpeed: Int // 인터페이스 안의 프로퍼티 (구현 클래스가 오버라이드 해야 함)
fun fly() // 추상 메서드
fun landing() { // 본문이 있는 디폴트 메서드
println("안전하게 착륙합니다.")
}
}
// 2. open 클래스 (상속 허용)
open class Animal(val name: String) {
open fun makeSound() {
println("$name 가 소리를 냅니다.")
}
}
// 3. 상속과 인터페이스 다중 구현
// Animal() 을 상속받고, Flyable 을 구현함
class Bird(name: String, override val maxSpeed: Int) : Animal(name), Flyable {
// 부모 클래스의 메서드 오버라이딩 (override 키워드 필수)
override fun makeSound() {
println("짹짹!")
}
// 인터페이스의 추상 메서드 오버라이딩
override fun fly() {
println("$name 가 최대 속도 $maxSpeed 로 하늘을 납니다!")
}
}
fun main() {
val sparrow = Bird("참새", 50)
sparrow.makeSound()
sparrow.fly()
sparrow.landing() // 디폴트 메서드 사용
}