본문 바로가기

코틀린

코틀린(Kotlin) - 클래스 계층 정의

코틀린 인터페이스

코틀린 인터페이스 안에는 추상 메소드뿐 아니라, 구현이 있는 메소드도 정의할 수 있습니다.

 

/** 간단한 인터페이스 구현 */

interface Clickable {
    fun click()
}

class Button : Clickable {
    override fun click() = println("클릭")
}

>>> Button().click()
클릭

 

자바에서는 extends와 implements를 사용하지만, 코틀린에서는 클래스 이름 뒤에 콜론(:)을 붙이고 인터페이스와 클래스를 명시하는 것으로 상속과 인터페이스 구현을 처리합니다.

오버라이드 하는 경우, 자바의 @Override 어노테이션과 비슷하게 코틀린에서는 override라는 키워드를 사용합니다.

 

/** 인터페이스 안에, 구현이 있는 메소드 정의하기 */

interface Clickable {
    fun click() //일반 메소드 선언
    fun showOff() = println("클릭") //구현이 있는 메소드 선언
}

class Button : Clickable {
    override fun click() = println("클릭")
    //showOff()를 구현하지 않아도 된다
}

>>> Button().showOff()
클릭

 

이 인터페이스를 구현하는 클래스는 click()에 대한 구현을 반드시 작성해야 하지만, showOff() 메소드의 경우, 디폴트 구현이 있기 때문에 새로운 로직을 정의할 수도 있고, 그냥 생략하고 디폴트 구현을 사용할 수도 있습니다.

open, final, abstract 변경자 : 디폴트는 final

코틀린에서는 상속에 대해 굉장히 규칙적입니다.

하위 클래스가 부모 클래스를 상속 받았을 경우, 만약 부모 클래스의 변경이 일어남으로써 하위 클래스에 영향이 가는 경우가 생기기 마련입니다.

즉, 어떤 클래스가 자신을 상속해야 하는지에 대한 정확한 규칙이 없다면, 누군가의 수정에 의해서 하위 클래스가 의도와는 다른 동작으로 바뀔 수도 있는 위험이 있는 것입니다.

이 문제를 해결하기 위해 코틀린에서는, 하위 클래스에서 오버라이드 하게 의도된 클래스와 메소드가 아니라면 모두 기본적으로 final인 이유입니다.

만약, 어떤 클래스나 메소드, 프로퍼티의 상속을 허용하려면 앞에 "open" 이라는 키워드를 붙여줘야 합니다.

 

/** open으로 오버라이드 허용 */

open class RichButton : Clickable { //이 클래스는 상속 허용되어 있습니다. (open이 붙어있기 때문)
    fun disable() {} //이 함수는 final이기 때문에, 하위 클래스에서 오버라이드 할 수 없습니다.
    open fun animate() {} //이 함수는 오버라이드 가능합니다.
    
    override fun click() {} //오버라이드한 함수는 기본적으로 오버라이드 허용되어 있습니다.
    final override fun click() {} //만약 오버라이드한 메소드를 하위 클래스에서 오버라이드 못하게 하려면
                                  //메소드명 앞에 final을 명시해야 합니다.
}

 

추상 클래스의 경우, 자바와 동일하게 "abstract"로 선언할 수 있습니다.

추상 클래스는 애초에 하위 클래스에서 추상 멤버를 오버라이드 하도록 하려는 목적이기 때문에, 추상 멤버 앞에는 open 키워드를 명시할 필요가 없습니다.

 

/** 추상 클래스 정의하기 */

abstract class Animated {
    abstract fun animate() //추상메소드로 하위 클래스에서 반드시 오버라이드 해야 합니다.
    open fun stopAnimate() {} //추상클래스에 속했더라도, 비추상 메소드는 기본적으로 final이지만
                              //원하는 경우 open으로 오버라이드를 허용 할 수 있습니다.
}

 

코틀린의 상속 제어 변경자 정리표

변경자 오버라이드 설명
final 오버라이드 X 클래스 멤버의 기본 변경자
open 오버라이드 O 반드시 open을 명시해야 오버라이드 가능
abstract 반드시 오버라이드 해야 함

추상 클래스의 멤버에만 붙일 수 있다.

추상 멤버에는 구현이 있으면 안 된다.

override

상위 클래스나 상위 인스턴스의 멤버를

오버라이드 할 때 사용

오버라이드 하는 멤버는 기본적으로 허용되어 있지만,

오버라이드를 금지하려면 final을 명시해야 함.

 

접근 제어자 : 기본은 public

변경자 클래스 멤버 최상위 선언
public(기본 접근제어자) 모든 곳에서 접근 가능 모든 곳에서 접근 가능
internal 같은 모듈 안에서만 접근 가능 같은 모듈 안에서만 접근 가능
protected 하위 클래스 안에서만 접근 가능 최상위 선언에 적용할 수 없음
private 같은 클래스 안에서만 접근 가능 같은 파일 안에서만 접근 가능