자바에는 매서드 오버라이딩이라는 기술을 지원한다. 서브클래스에서 같은 매서드 명을 가지고 있을 때, @override라는 어노테이션을 붙여주면 슈퍼클래서의 매서드를 무시하고 서브클래스의 매서드를 실행하는 기술이다.
코틀린에서도 오버라이딩을 할 수 있다.
fun main(args: Array<String>): Unit {
AAA().func()
BBB().func()
}
open class AAA {
open fun func() = println("AAA")
}
class BBB : AAA() {
override fun func(){
super.func()
println("BBB")
}
}
함수도 선언할때 무조건 final이 붙기 때문에, 오버라이딩을 기본적으로 허용하지 않는다. 허용하기 위해서는 반드시 open 키워드를 붙여 제한을 풀어야 한다.
또한, 서브클래스에서 오버라이딩을 하려면 함수 앞에 override라는 키워드를 붙여 오버라이딩 된 함수라는 것을 알려야 한다. override 키워드에는 open 키워드가 포함되어 있기 때문에 굳이 open을 붙여줄 필요는 없다.
이 코드는 super. 이라는 명령어를 통해 모체의 func 함수를 우선적으로 호출하고, 이후에 서브클래스의 func 함수를 실행한다.
결과 :
AAA
AAA
BBB
이렇게 open 된 함수는 계속 오버라이딩 할 수 있다. 이 때, 아래 코드에 오버라이딩을 적용하지 않으려면 final 키워드를 붙여줘야한다.
final override fun func()
물론 getter, setter도 함수의 일종이기 때문에 프로퍼티도 오버라이딩 가능하다.
fun main(args: Array<String>): Unit {
val test = BBB()
test.number=5
test.number
}
open class AAA {
open var number = 10
get() {
println("AAA get 적용")
return field
}
set(value) {
println("AAA set 적용")
field = value
}
}
class BBB : AAA() {
override var number: Int
get() {
println("BBB get 적용")
return super.number
}
set(value) {
println("BBB set 적용")
super.number = value
}
}
프로퍼티가 오버라이딩 되면 get과 set을 커스터마이징 할때 override 키워드를 붙일 필요 없이 자연스럽게 오버라이딩이 된다.
결과 :
BBB set 적용
AAA set 적용
BBB get 적용
AAA get 적용
반응형
'Android > 안드로이드 스터디(Kotlin)' 카테고리의 다른 글
Kotlin] 19. Nullable? (0) | 2020.12.09 |
---|---|
Kotlin] 18. Nothing (0) | 2020.12.09 |
Kotlin] 16. 상속 (0) | 2020.12.09 |
Kotlin] 15. 멤버함수의 중위 표기법(infix) (0) | 2020.12.08 |
Kotlin] 14. in (0) | 2020.12.07 |