Fragile base class
취약한 베이스 클래스란 베이스 클래스가 변경됨으로서 자식 클래스들의 동작이 얘기치않게 바뀔 수 있다는 말이다.
자식 클래스가 부모 클래스(베이스 클래스)를 상속받았을때 부모 클래스를 작성한 사람의 의도와 다른 방식으로 오버라이드할 가능성이 있다.
이때 부모 클래스가 변경되는 경우 자식 클래스의 동작에 큰 영향을 미칠 수 있다.
따라서 다른 클래스가 상속할 클래스를 정의할 때 오버라이드하도록 설계하는 것이 아니라면 모두 final(오버라이드 불가)로 만들라는 뜻이다.
코틀린은 이러한 철학을 따른다.
그래서 클래스의 상속을 허용하려면 클래스 앞에 open
이라는 변경자를 붙여야하고 오버라이드를 허용하기 위해서도 open
을 붙어야한다.
상속 가능한 클래스 정의
상속이 가능한 클래스를 정의해본다.
kotlin
open class RichButton: Clickable {
fun disable() {} // 오버라이드 불가
open fun animate() {} // 오버라이드 가능
// 이미 오버라이드한 메서드에 대해서는 기본적으로 open 되어있다. 따라서 오버라이드 금지를 위해선 final을 붙여줘야한다.
override fun click() {}
}
추상 클래스와 추상 메서드
코틀린에서도 추상 클래스를 abstract
로 선언할 수 있다.
추상 클래스는 인스턴스화 할 수 없다.
추상 멤버는 항상 열려있고 open
변경자를 명시할 필요가 없다.
추상 클래스안에 있는 비추상 멤버나 함수는 기본적으로 final
이다.
클래스에서의 access modifier
Kotlin in action
에는 다음과 같은 표로 안내하고 있다.
변경자 | 이 변경자가 붙은 멤버는... | 설명 |
---|---|---|
final | 오버라이드 할 수 없음 | 클래스 멤버의 기본 변경자이다 |
open | 오버라이드 할 수 있음 | 클래스 멤버 앞에 open 이 명시되어 있어야한다 |
abstract | 오버라이드 해야만 함 | 추상 클래스의 멤버에만 붙일 수 있다. 미리 구현할 수 없다. |
override | 클래스에서 구현하고 있는 멤버 | 오버라이드하고 있는 멤버는 기본적으로 open 이다 |