자바에서는 클래스에 final이 붙지 않으면 다른 클래스에서 상속이 가능하다.
하지만 코틀린에서의 클래스와 메서드는 기본적으로 final이다.
따라서 다른 클래스의 상속을 허용하려면 그 클래스 앞에 open 키워드를 붙여야 한다. 또한, override를 허용하고 싶은 메서드나 프로퍼티 앞에도 open 키워드를 붙여야 한다.
open class Person {
// age 메서드는 하위 클래스에서 override 불가능
fun age(): Int {
return 30
}
// 하위 클래스에서 override 가능
open fun name(): String {
return "Hong Gildong"
}
}
class Friend() : Person() {
// age 메서드는 override 불가능
// name 메서드는 open 붙어서 override 가능
override fun name(): String {
return "Kim Gilsun"
}
}
코틀린의 가시성은 자바와 비슷하다. 하지만 자바의 기본 가시성인 패키지 전용은 코틀린에 없다. 대신 internal 이라는 가시성을 제공한다.
internal은 동일한 모듈 내에 있는 클래스들의 접근을 제한한다. 모듈은 안드로이드의 경우, gradle 프로젝트가 모듈이 될 수 있다.
| 변경자 | 클래스 멤버 | 최상위 선언 |
|---|---|---|
| public | 모든 곳에서 사용 가능 | 모든 곳에서 볼 수 있음 |
| internal | 같은 모듈 안에서만 사용 가능 | 같은 모듈 안에서만 볼 수 있음 |
| protected | 하위 클래스에서만 사용 가능 | 클래스 밖에서는 적용할 수 없음 |
| private | 같은 클래스 안에서만 사용 가능 | 클래스 밖에서는 같은 파일 안에서만 사용 가능 |
참고