오버라이딩
상속시에는 기본적으로 슈퍼클래스에 있는 함수와 같은 이름과 형태를 가진 함수는 서브클래스에서 만들 수 없다.
하지만 수퍼클래스에서 허용만 한다면 "오버라이딩"이라는 방법으로 서브클래스에서 같은 이름과 형태로 된 함수의 내용을 다시 구현할 수 있다.
fun main() {
var t = Tiger()
t.eat()
}
open class Animal{
open fun eat(){
println("음식을 먹습니다.")
}
}
class Tiger : Animal(){
override fun eat(){
println("고기를 먹습니다.")
}
}
추상화
수퍼클래스에서는 함수의 구체적인 구현은 없고 단지 Animal의 모든 서브클래스는 eat이라는 함수가 "반드시 있어야 한다"는 점만 명시하여 각 서브클래스가 비어있는 함수의 내용을 필요에 따라 구현하도록 하려면 "추상화"라는 개념을 사용한다.
추상화는 선언부만 있고 기능이 구현되지 않은 "추상함수" 그리고 추상함수를 포함하는 "추상클래스"라는 요소로 구성된다.
abstract class Animal{
abstract fun eat() // *추상함수는 비어있는 껍데기라고 생각하세요.
fun sniff(){
println("킁킁")
}
}
이렇게 abstract를 붙인 추상클래스는 일부 함수가 구현되지 않은 "미완성 클래스"이기 때문에 단독으로는 인스턴스를 만들 수 없다.
따라서 반드시 서브클래스에서 상속을 받아 abstract표시가 된 함수들을 구현해줘야 한다.
abstract class Animal{
abstract fun eat()
fun sniff(){
println("킁킁")
}
}
class Rabbit : Animal( ) {
override fun eat( ) {
println("당근을 먹습니다.")
}
}
인터페이스
추상화를 하는 또 다른 방법으로 인터페이스가 있다.
다른 언어에서 원래 인터페이스는 추상함수로만 이루어져 있는 "순수 추상화 기능"을 말하는 것이라고 알고있을텐데 코틀린에서는 인터페이스가 (속성),추상함수,일반함수 모두를 가질 수 있다.
다만 추상함수는 생성자를 가질 수 있는 반면, 인터페이스는 생성자를 가질 수는 없으며 인터페이스에서 구현부가 있는 함수 -> open함수로 간주.
구현부가 없는 함수 -> abstract 함수로 간주 하기때문에 별도의 키워드(open/구현부가있는함수 , abstract/구현부가 없는 함수)가 없어도 포함된 모든 함수를 서브클래스에서 구현 및 재정의가 가능하다, 또한 한번에 여러 인터페이스를 상속받을 수 있음으로 좀 더 유연한 설계가 가능하다.
인터페이스 2개를 한번에 상속받는 클래스
fun main( ) {
var d = Dog( )
d.run( )
d.eat( )
}
interface Runner {
fun run( ) // 구현부가 없는abstract 함수
}
interface Eater {
fun eat( ) { // 구현부가 있는 open 함수
println("음식을 먹습니다")
}
}
class Dog : Runner, Eater { // *Dog 클래스로 두 인터페이스를 상속받는법
override fun run( ){
println("우다다다 뜁니다")
}
override fun eat( ){
println("허겁지겁 먹습니다")
}
}
정리하면 오버라이딩은 이미 구현이 끝난 함수의 기능을 서브클래스에서 변경해야 할 때, 그리고 추상화는 형식만 선언하고 실제 구현은 서브클래스에서 일임할 때 사용하는 기능이며, 인페페이스는 서로 다른 기능들을 여러 개 물려주어야할 때 유용한 기능이다.
'코틀린' 카테고리의 다른 글
코틀린(12) - 스코프, 접근제한자 (0) | 2022.03.21 |
---|---|
코틀린(11) - 코틀린의 기본적인 프로젝트 구조 (0) | 2022.03.21 |
코틀린(9) - 상속, 상속으로 속성과 기능을 확장 (0) | 2022.03.21 |
코틀린(8) - 생성자 (0) | 2022.03.21 |
코틀린(7) - 클래스 (0) | 2022.03.21 |
댓글