코틀린 (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() {
     
    }
}

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 접근자입니다.
추상 메소드와 open 을 명시적으로 추가한 메소드는  override 할 수 있습니다.

abstract class Animated {
    //추상 메소드는 열려있다
    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 라서 안됨
}

위 코드는 에러가 발생합니다.
확장 함수는 public 만 가능하며 private, protected, internal 은 접근할 수 없습니다.
해결하기 위해서는 몇가지 방법이 있습니다.

internal fun TalkativeButton.giveSpeech() { .. } //internal 을 추가

public open class TalkativeButton : Focusable { ... } //internal -> public 으로 변경

코틀린 가시성을 자바에서 사용하면 internal 은 자바의 public 바이트코드이기때문에 모듈 외부에서 자바 코드로 접근할 수 있습니다.

그리고 protected 또한 코틀린 클래스와 같은 패키지로 만들어 접근할 수 있습니다.

그러나 코틀린 컴파일러는 internal 멤버 이름을 난독처리합니다.
그 이유는 하위 클래스 메소드 이름이 상위 클래스 internal  메소드와 같아 메소드를 오버라이드 하는 경우를 방지하고 internal 클래스를 모듈 외부에서 사용하는 것을 방지하기 위함입니다.

*개인적으로 코틀린을 공부하면서 정리한 자료입니다. 수정 사항 및 이슈가 있는 경우 메일 부탁드립니다.

댓글

이 블로그의 인기 게시물

코틀린 (Kotlin) filter, map, all, any, count, find, groupBy, flatMap 함수 정리

코틀린 (Kotlin) 인터페이스 정리

RecyclerView 에서 notifyItemChanged()의 payload 이해하기