본문 바로가기
Android/안드로이드 스터디(Kotlin)

Kotlin] 17. 오버라이딩

by 김마리님 2020. 12. 9.

자바에는 매서드 오버라이딩이라는 기술을 지원한다. 서브클래스에서 같은 매서드 명을 가지고 있을 때, @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