수퍼 클래스에서 허용한다면 서브 클래스에서 같은 이름과 형태로 된 함수의 내용을 다시 구현할 수 있음
fun main() {
var t= Tiger() //tiger 인스턴스 생성
t.eat()//eat함수 실행 ->음식을 먹습니다 실행됨 -> 고기를먹습니다 (override후)
}
open class Animal { //수퍼클래스에서
open fun eat(){ //open이 붙은 함수는 서브클래스에서 override를 붙여 재구현
println("음식을 먹습니다")
}
}
class Tiger: Animal(){ //tiger클래스가 animal클래스를 상속받음.
override fun eat(){ //서브클래스에서 eat함수 재구현
println("고기를 먹습니다")
}
}
-수퍼클래스에서는 함수의 구체적인 구현은 없고, 단지 Animal의 모든 서브클래스는 eat이라는 함수가 반드시 있어야 한다는 점만 명시
각 서브 클래스가 비어있는 함수의 내용을 필요에 따라 구현함.
⇒선언부만 있고 기능이 구현되지 않은 추상 함수
⇒ 추상함수를 포함하는 추상 클래스
fun main() {
var r = Rabbit()
r.eat()
r.sniff()
}
abstract class Animal {
abstract fun eat()
fun sniff(){
println("킁킁")
}
}
class Rabbit: Animal(){
override fun eat(){
println("당근을 먹습니다")
}
}
→ 인터페이스는 생성자를 가질 수 없음.
구현부가 있는 함수 -> OPEN 함수로 간주
구현부가 없는 함수 -> abstract 함수로 간주
→서브 클래스에서 구현 및 재정의가 가능.
→한번에 여러 인터페이스를 상속 받을 수 있음, 유연한 설계 가능!!
fun main() {
var d = Dog()
d.run()
d.eat()
}
interface Runner{ //인터페이스 생성
fun run() //run이라는 함수 생성
}
interface Eater{ //인터페이스 생성
fun eat(){
println("음식을 먹습니다")
}
}
//인터페이스 2개를 한번에 상속받는 클래스 생성
class Dog **: Runner, Eater** { //Dog클래스로 두 인터페이스 상속 : 인터페이스1, 인터페이스2
override fun run(){
println("우다다다 뜁니다")
}
override fun eat() {
println("허겁지겁 먹습니다")
}
}