-> 상속
이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 말합니다. 상속하는 클래스를 super class
, 상속받는 클래스를 sub class
라고 합니다.
코틀린의 최상위 클래스는 Any 입니다. 즉, Any 로 선언 시 모든 데이터 타입이 대입될 수 있습니다. Any 클래스의 내부엔 equals(), hashCode(), toString()등의 메소드가 있습니다.
✓ 코틀린의 Any와 자바의 Object 의 차이점
Any 를 자바로 디컴파일 해보면 Object 타입으로 변환됩니다. Any 에는 wait(), notify(), notifyAll() 과 같은 쓰레드를 제어하는 메소드가 없습니다. 사용하려면 (any as Object).notify() 와 같은 형변환이 필요합니다.
java 의 상속 키워드가 extends 인 것처럼 코틀린의 상속 키워드는 : (콜론)
입니다.
코틀린의 클래스, 메소드는 기본적으로 final 타입으로 상속이 불가합니다. 상속을 허용하려면 클래스 앞에 open
키워드를 사용해 명시해 주어야 합니다.
-> 이미 구현이 끝난 함수의 기능을 서브 클래스에서 재정의해서 사용하는 것을 의미합니다.
-> 구현되지 않고 형식만 선언된 추상 메소드를 가진 클래스를 의미합니다. 추상클래스는 상속을 통해 생성될 자식 클래스에게 메소드 오버라이딩에 강제성을 주기 위해 사용합니다.
-> 서로 다른 기능들을 여러 개 물려주어야 할 때 사용합니다. 반드시 구현되어야 할 메소드와 프로퍼티를 선언합니다.
✓ 인터페이스와 추상클래스의 차이점
- 인터페이스는 다중 상속이 가능하고, 추상클래스는 하나의 추상클래스만 상속가능합니다.
- 인터페이스는 기본이 open 이므로 open 을 명시할 필요가 없지만, 추상클래스는 final 이 기본이므로 open 을 반드시 명시해 주어야 합니다.
- 인터페이스는 여러사람이 사용하기 위해 큰 틀을 잡아 놓은 설계도, 추상클래스는 상속받았을 때, 반드시 재정의 되어야 할 메소드를 위해 사용된다고 생각하면 됩니다.
fun main() {
val a : Animal = Dog("꼬봉", 7)
a.introduce()
val b = Dog("복이", 3)
b.introduce()
b.bark()
val c = Cat("나비", 5)
c.introduce()
c.meow()
val d = Pigeon("구구", 10)
d.introduce()
d.fly()
}
open abstract class Animal(var name: String, var age: Int, var type: String) {
open abstract fun introduce()
}
class Dog(name: String, age: Int) : Animal(name, age, "개") {
override fun introduce() { // open 이므로 override 가능
println("저는 개 : $name 이고, $age 살 입니다.")
}
fun bark() {
println("멍멍")
}
}
class Pigeon(name: String, age: Int) : Animal(name, age, "비둘기"), Bird {
override fun introduce() {
println("저는 비둘기 :$name 이고, $age 살 입니다.")
}
override fun fly() {
println("구구구구구..")
}
}
class Cat(name: String, age: Int) : Animal(name, age, "고양이") {
override fun introduce() {
println("저는 고양이 : $name 이고, $age 살 입니다.")
}
fun meow() {
println("야옹야옹")
}
}
interface Bird {
fun fly()
val name: String
}
저는 개 : 꼬봉 이고, 7 살 입니다.
저는 개 : 복이 이고, 3 살 입니다.
멍멍
저는 고양이 : 나비 이고, 5 살 입니다.
야옹야옹
저는 비둘기 :구구 이고, 10 살 입니다.
구구구구구..