코틀린 (Kotlin) open, final, abstract
코틀린 open 접근자
코틀린의 클래스는 디폴트로 final public 입니다.그래서 상속을 하려면 open class 이여야 하며 open fun 이여야 합니다.
open class RichButton : Clickable {
//interface 는 public 이기 때문에 override 가능
override fun click() {
}
//final 이기때문에 override 불가능
fun disable() {
}
//open 이기때문에 override 가능
open fun animate() {
}
}
//interface 는 public 이기 때문에 override 가능
override fun click() {
}
//final 이기때문에 override 불가능
fun disable() {
}
//open 이기때문에 override 가능
open fun animate() {
}
}
RichButton 의 열려있는 animate() 를 상속한 하위 클래스에서 override 하면서 final 로 제한할 수 있습니다.
open class RichRichButton : RichButton() {
//추가로 final 을 붙이면 하위 클래스에서는 override 할 수 없다
final override fun click() {
super.click()
}
final override fun animate() {
super.animate()
}
final override fun showOff() {
super.showOff()
}
}
//추가로 final 을 붙이면 하위 클래스에서는 override 할 수 없다
final override fun click() {
super.click()
}
final override fun animate() {
super.animate()
}
final override fun showOff() {
super.showOff()
}
}
코틀린 추상 클래스
코틀린의 추상클래스는 자바와 같습니다.다만, 추상메소드가 아닌 메소드는 final 접근자입니다.
추상 메소드와 open 을 명시적으로 추가한 메소드는 override 할 수 있습니다.
abstract class Animated {
//추상 메소드는 열려있다
abstract fun animate()
//추상 클래스이더라도 추상 메소드가 아니면 final 이다
fun stopAnimating() {
}
//override 를 허용하려면 open 명시
open fun animateTwice() {
}
}
//추상 메소드는 열려있다
abstract fun animate()
//추상 클래스이더라도 추상 메소드가 아니면 final 이다
fun stopAnimating() {
}
//override 를 허용하려면 open 명시
open fun animateTwice() {
}
}
코틀린 private, protected, public
코틀린의 가시성은 자바와 비슷합니다.다만, 패키지 전용은 코틀린에 없습니다.
대신 internal 이라는 가시성을 제공합니다.
internal은 모듈이라는 범위를 갖습니다.
모듈은 한 번에 한꺼번에 컴파일되는 코틀린 파일들을 의미합니다.
안드로이드의 경우 그레들 프로젝트가 모듈이 될 수 있습니다.
최상위 선언(클래스 밖)에서 private 는 같은 파일 안에서만 접근이 허용됩니다.
최상위 선언에서 protected 는 적용할 수 없습니다.
- public : 모든 곳에서 사용 가능
- internal : 같은 모듈 안에서만 사용 가능
- protected : 상속받은 하위 클래스에서 사용 가능하며 최상위 선언(클래스 밖)에서는 적용할 수 없음
- private : 같은 클래 안에서만 사용 가능하며 최상위 선언(클래스 밖)에서는 같은 파일 안에서만 사용 가능
자바에서 protected 는 패키지만 같으면 접근할 수 있지만, 코틀린에서 protected 는 상속한 하위 클래스만 접근할 수 있습니다.
internal open class TalkativeButton : Focusable {
private fun yell() = "" //같은 클래스만 접근 가능
protected fun whisper() = "" //하위클래스에서 접근 가능
}
fun TalkativeButton.giveSpeech() { //확장 함수에서는 public 만 접근 가능
yell() //private 라서 안됨
whisper() //protected 라서 안됨
}
private fun yell() = "" //같은 클래스만 접근 가능
protected fun whisper() = "" //하위클래스에서 접근 가능
}
fun TalkativeButton.giveSpeech() { //확장 함수에서는 public 만 접근 가능
yell() //private 라서 안됨
whisper() //protected 라서 안됨
}
위 코드는 에러가 발생합니다.
확장 함수는 public 만 가능하며 private, protected, internal 은 접근할 수 없습니다.
해결하기 위해서는 몇가지 방법이 있습니다.
internal fun TalkativeButton.giveSpeech() { .. } //internal 을 추가
public open class TalkativeButton : Focusable { ... } //internal -> public 으로 변경
public open class TalkativeButton : Focusable { ... } //internal -> public 으로 변경
코틀린 가시성을 자바에서 사용하면 internal 은 자바의 public 바이트코드이기때문에 모듈 외부에서 자바 코드로 접근할 수 있습니다.
그리고 protected 또한 코틀린 클래스와 같은 패키지로 만들어 접근할 수 있습니다.
그러나 코틀린 컴파일러는 internal 멤버 이름을 난독처리합니다.
그 이유는 하위 클래스 메소드 이름이 상위 클래스 internal 메소드와 같아 메소드를 오버라이드 하는 경우를 방지하고 internal 클래스를 모듈 외부에서 사용하는 것을 방지하기 위함입니다.
*개인적으로 코틀린을 공부하면서 정리한 자료입니다. 수정 사항 및 이슈가 있는 경우 메일 부탁드립니다.
댓글
댓글 쓰기