본문 바로가기
Android & Kotlin/Kotlin

[Kotlin 상속제어 변경자] open, final, abstract, override

by 말린밴댕이_공부 2024. 5. 2.
반응형

상속을 위한 설꼐와 문서를 갖추거나, 그럴 수 없다면 상속을 금지한다.

이는 하위 클래스에서 오버라이드하게 의도된 클래스와 메서드가 아니라면 모두 final로 만들라는 뜻이다.

*final : 클래스, 메서드 또는 프로퍼티에 사용되어 재정의를 금지하는 역할

 

open

어떤 클래스의 상속을 허용하려면 클래스 앞에 open 변경자를 붙여야 한다.

메서드,프로퍼티도 오버라디으를 허용하고 싶다면 마찬가지고 open 변경자를 붙여야 한다.

interface Clickable{
    fun click()

    fun showOff() = println("clickable Test")
}

open class RichButton : Clickable {
    fun disable() {}
    
    open fun animate() {}
    
    override fun click() {}
}

open class RichButton : open 변경자를 사용하여 다른 클래스가 이 클래스를 상속할 수 있게 열려있다.

 

fun disable() : 이 함수는 파이널로 하위 클래스가 이 메서드를 오버라이드 할 수 없다.

 

open fun animate() : 이 함수는 열려있고 하위 클래스에서 오버라이드 해도된다.

 

override fun click() : 상위 클래스에서 선언된 열려있는 메서드를 오버라이드 하고 기본적으로 열려있다.

아래의 예시처럼 오버라이드 하지 못하게 금지하려면 오버라이드 하는 메서드 앞에 final을 명시해야한다.

open class RichButton : Clickable {
    final override fun click() {}
}

 

abstract

 

abstract도 자바처럼 클래스 선언을 할 수 있다.

추상 클래스는 인스턴스화 할 수 X

구현이 없는 추상 멤버가 있기 때문에 하위 클래스에서 오버라이드 해야 함

abstract class Animated {

    abstract fun animate()

    open fun stopAnimating() {}
    
    fun animateTwice() {}
 }

 

Animated는 추상클래스로 인스턴스를 만들수가 없다.

 

abstract fun animate() : 추상함수로 구현이 없으며 하위 클래스에서 오버라이드 필수

 

open fun stopAnimating()  /  fun animateTwice()

: 추상 클래스에 속했더라도 비추상 함수는 기본적으로 final이지만 open으로 오버라이드를 허ㅛㅇ할 수 있다. → open 변경자를 명시할 필요는 없음.

 

 

클래스 내 상속 제어 변경자 

변경자 변경자가 붙은 맴버 설명
final override 할 수 x 클래스 맴버의 기본 변경자
open override 할 수 o 반드시 open을 명시해야 오버라이드 할 수 o
abstract override 필수 추상 클래스의 멤버에만 이 변경자를 붙일 수 o, 추상 멤버에는 구현 x
override 상위 클래스나 상위 인스턴스의 멤버를 오버라이드하는 중 override하는 멤버는 기본적으로 열려 있으며, 하위 오버라이드 x → final 명시
반응형

댓글