open,final,abstract 변경자

자바의 클래스와 메소드드는 기본적으로 상속에 대해 열려 있지만 코틀린의 클래스와 메소드는 기본적으로 final이다.
어떤 클래스의 상속을 허용하려면 클래스 앞에 open 변경자를 붙여야 한다. 더불어 오버라이드를 허용하고 싶은 메소드나 프로퍼티의 앞에도 open 변경자를 붙여야 한다.

클래스 내에 오버라이드를 강제 금지 시키려면 final 변경자를 붙이면 된다. 그럼 상속 받은 클래스는 해당 메소드를 오버라이드 할 수 없다.

interface ClickAble{
    fun showOff()= println("i'm click able!")
    fun click()
    fun showOn()
}


open class BaseButton :ClickAble{ //이 클래스는 열려 있는 클래스다. 다른 클래스가 이 클래스를 상속 할 수 있다.
    
    fun disable(){} //이 함수는 파이널이다. 하위 클래스가 이 메소드를 오버라이드 할 수 없다.
    
    open fun animate(){} // 이 함수는 열려 있다. 하위 클래스에서 이 메소드를 오버라이드 해도 된다. 
    
    override fun click(){} // 이 함수는 열려있는 메소드를 오버라이드 한다.
    
    final override fun showOn() {} // final 변경자를 이용해 오버라이드를 금지 시킨다.

}

class RichButton:BaseButton(){   //BaseButton 상속

    override fun animate() {  //open animate 함수 오버라이드
        super.animate()
    }
      override fun showOff() { //ClickAble interface 메소드 상속
        super.showOff()
    }
}
  • abstract 추상 클래스 정의하기

일반 자바와 마찬가지로 abstract는 하위 클래스에서 오버라이드 해야 한다.

abstract class Animated{   //이 클래스는 추상 클래스이다.
    abstract fun animate()  // 이 함수는 추상 함수이다. 이 함수에는 구현이 없다. 하위 클래스에서는 이 함수를 무조건 오버라이드 해야한다.
    
    open fun stopAnimating(){}
    fun animateTwice(){}
    //추상클래스내에 속하지만 비추상 함수이므로 무조건 오버라이드 할 필요 없다.
}

final(기본 변경자) : 오버라이드 할수 없음 / 클래스 멤버의 기본 변경자
open : 오버리이드 할수 있음 / 반드시 oepn을 명시해야 오버라이드 할 수 있다
abstract : 무조건 오버라이드 해야 함/ 추상 클래스의 멤버에만 이 변경자를 붙일 수 있다. 추상 멤버에는 구현이 있으면 안된다.
override : 상위 클래스나 상위 인스턴스의 멤버를 오버라이드 하는중 / 오버라이드 하는 멤버는 기본적으로 열려있다. 하위 클래스의 오버라이드를 금지하려면 final을 명시해줘야한다.

가시성 변경자

가시성 변경자는 코드 기반에 있는 선언에 대한 클래스 외부 접근을 제어한다. 코틀린에서는 같은 패키지 내 모듈안에서만 볼 수 있는 internal 가시성을 추가했다.

public(기본 가시성) : 모든곳에서 볼 수 있다.
internal : 같은 모듈 안에서만 볼 수 있다.
protected : 하위 클래스 안에서만 볼 수 있다. 최상위 선언에는 사용 할 수 없다.
private : 같은 클래스 안에서만 볼 수 있다.

internal open class TalkativeButton :Focusable{
    private fun yell() = println("Yell")
    protected fun whisper() = println("Let's talk!")
}

fun TalkativeButton.giveSpeech(){    //public 멤버가 자신의 intenal 수신 타입인 TalkativeButton 노출함
    yell() //private 가시성인 yell 접근 할수 없음
    whisper() //protected whisper을 접근 할수 없음
}

internal
클래스를 확장한 함수는 private , protected 함수를 불러 올 수 없다.

profile
station3 다방 안드로이드 개발자

0개의 댓글