더북(TheBook)

2.2.2 인터페이스를 구현하거나 클래스를 확장하기

클래스에서 하나 이상의 인터페이스를 구현하거나 다른 클래스를 확장하고 싶다면 그런 인터페이스나 클래스를 클래스 정의 뒤에 나열하면 된다.

class Person(
    val name: String,
    val registered: Instant
) : Serializable,
    Comparable<Person> {
    override fun compareTo(other: Person): Int {
        ...
    }
}

클래스 확장과 인터페이스 구현에 같은 구문을 사용한다. 클래스를 확장할 때는 부모 클래스 이름 뒤에 인자들이 들어 있는 괄호가 붙는다는 점이 인터페이스를 구현할 때와 다른 부분이다.

class Member(name: String, registered: Instant) : Person(name, registered)

하지만 클래스는 기본적으로 상속 불가임에 유의하라. 이 예제를 컴파일하려면 확장하려는 부모 클래스를 open으로 선언해야만 한다. open확장에 대해 열려 있다는 뜻이다.

open class Person(val name: String, val registered: Instant)

확장할 것을 염두에 두고 구체적으로 설계한 클래스만 확장을 허용하는 것이 좋은 프로그래밍 습관이다. 앞의 코드를 보면 코틀린은 자바와 달리 확장을 고려하지 않고 설계한 클래스를 확장하지 못하게 막음으로써 이런 규칙을 강화한다는 사실을 알 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.