자바와 달리 코틀린 선언은 기본적으로 final이면 public이다.
중첩클래스는 기본적으로 내부 클래스가 아니다. 그래서 외부 클래스에 대한 참조가 없다.
sealed 변경자는 클래스 상속을 제한한다.
코틀린 인터페이스 안에는 추상 메소드뿐 아니라 구현이 있는 메소드도 정의할 수 있다. 자바 8의 디폴트 메소드와 비슷하다.
인터페이스에는 아무런 상태(필트)도 들어갈 수 없다.
인터페이스를 원하는 만큼 개수 제한 없이 마음대로 구현할 수 있지만, 클래스는 오직 하나만 확장할 수 있다.
상위 클래스에 있는 메소드와 시그니처가 같은 메소드를 하위 클래스에서 override 없이 선언할 경우 컴파일이 안 된다. override를 붙이거나 메소드 이름을 바꿔야 한다.
동일한 메소드를 가진 다른 인터페이스를 한 클래스에서 함께 구현할 때, 해당 메소드를 대체할 오버라이딩 메소드를 직접 제공하지 않으면 컴파일 오류가 발생한다.
Class 'Button' must override public open fun showOff(): Unit defined in Clickable because it inherits multiple interface methods of it
즉, 이름과 시그니처가 같은 멤버 메소드에 대해 둘 이상의 디폴트 구현이 있는 경우 인터페이스를 구현하는 하위 클래스에서 명시적으로 새로운 구현을 제공해야 한다.
interface Focusable {
fun setFocus(b: Boolean) = println("I ${if (b) "got" else "lost"} focus.")
fun showOff() = println("I'm focusable!")
}
interface Clickable {
fun click()
fun showOff() = println("I'm clickable!")
}
class Button : Clickable, Focusable {
override fun click() = println("I was clicked")
override fun showOff() {
super<Clickable>.showOff()
super<Focusable>.showOff() // 상속한 함수를 모두 호출할 필요는 없다.
}
}
코틀린의 클래스와 메소드는 기본적으로 final이다. 클래스의 상속을 허용하려면 클래스 앞에 open 변경자를 붙여야 한다. 오버라이드를 허용하고 싶은 메소드나 프로퍼티의 앞에도 open 변경자를 붙여야 한다.
오버라이드한 메소드는 기본적으로 열려있다. 오버라이드하는 메소드의 구현을 하위 클래스에서 오버라이드하지 못하게 금지하려면 final을 명시해야 한다.
open class RightButton: Clickable {
final override fun click() { }
}
스마트 캐스트는 타입 검사 뒤에 변경될 수 없는 변수에만 적용 가능하다. 클래스의 기본적인 상속 가능 상태가 final이기 때문에 스마트 캐스트가 가능하다.
abstract로 선언한 추상 클래스는 인스턴스화할 수 없다. 추상 클래스에는 구현이 없는 추상 멤버가 있기 때문에 하위 클래스에서 그 추상 멤버를 오버라이드해야만 하는 게 보통이다. 추상 멤버는 항상 열려있다. 따라서 추상 멤버 앞에 open 변경자를 명시할 필요가 없다.
추상 클래스에 속했더라도 비추상 함수는 기본적으로 final이기 때문에, 오버라이드를 허용하려면 open 키워드를 앞에 붙여야 한다.