Skip to content

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이다

Email: echo.youn@kakao.com