[Kotlin in Action] 13. 코틀린 인터페이스 구현

반응형
728x90
반응형

코틀린 인터페이스

코틀린 인터페이스는 자바8 인터페이스와 비슷하다. 코틀린 인터페이스 안에는 추상 메서드뿐 아니라 구현이 있는 메서드도 정의할 수 있다. 다만 인터페이스에는 아무런 상태(필드)도 들어갈 수 없다. 코틀린에서 클래스는 class로 정의하지만 인터페이스는 interface를 사용한다.

 

 

예제

Clickable.kt
interface Clickable {
    fun click()
    fun showOff() = println("I'm clicked") // default 구현이 있는 메서드
}

인터페이스 메서드도 디폴트 구현을 제공할 수 있다. 자바에서는 default를 메서드 앞에 붙여야하지만, 코틀린에서는 특별히 쓸 필요가 없다. 그냥 메서드 본문을 메서드 시그니처 뒤에 추가하면 된다.

 

이 인터페이스를 구현하는 클래스는 click에 대한 구현을 제공해야한다. 반면 showOff 메서드의 경우 새로운 동작을 정의할 수 있고, 그냥 정의를 생략해서 디폴트 구현을 사용할 수도 있다.

 

Button.kt

클래스 이름 뒤에 콜론(:)을 붙이고 인터페이스와 클래스 이름을 적는 것으로 클래스 확장과 인터페이스 구현을 모두 처리한다. 자바와 마찬가지로 클래스는 인터페이스를 원하는 만큼 개수 제한 없이 마음대로 구현할 수 있다. 클래스는 오직 하나만 확장할 수 있다.

class Button : Clickable {
    override fun click() {
        println("I was clicked")
    }
}

fun main() {
    Button().click(); // I was clicked
}

 

 

override

override 변경자는 상위 클래스나 상위 인터페이스에 있는 프로퍼티나 메서드를 오버라이드한다는 표시다.
자바와 달리 코틀린은 override 변경자를 꼭 사용해야한다.

override fun click() {
    println("I was clicked")
}

 

Focusable.kt
interface Focusable {
    fun setFocus(b: Boolean) = println("I ${if (b) "got" else "lost"} focus.")
    fun showOff() = println("I'm focusable!")
}

 

Button2.kt

Clickable, Focusable 2개의 인터페이스를 구현한다.

class Button2 : Clickable, Focusable {
    override fun click() {
        println("I was clicked")
    }
}

 

1) Clickable, Focusable 모두 showOff() 디폴트 메서드가 존재한다.

Button2 에서 showOff() 메서드를 구현하지 않으면 컴파일 오류가 발생한다.

Class 'Button2' must override public open fun showOff():
    Unit defined in chapter4_클래스_객체_인터페이스._1_클래스_계층.Clickable because it inherits multiple interface methods of it

이름과 시그니처가 같은 멤버 메서드에 대해 2개 이상의 디폴트 구현이 있는 경우, 인터페이스를 구현하는 하위 클래스에서 명시적으로 새로운 구현을 제공해야한다.

class Button2 : Clickable, Focusable {
    override fun click() {
        println("I was clicked")
    }
    
    override fun showOff() {
        ...
    }
}

 

 

super

상위 타입의 이름을 꺽쇠 괄호(<>) 사이에 넣어서 "super"를 지정하면 어떤 상위 타입의 멤버 메서드를 호출할지 지정할 수 있다.

class Button2 : Clickable, Focusable {
    override fun click() {
        println("I was clicked")
    }

    override fun showOff() {
        super<Clickable>.showOff()
        super<Focusable>.showOff()
    }
}

JAVA

Clickable.super.showOff()

 

 

결과 출력

fun main() {
    val button2 = Button2()
    button2.showOff() // I'm clicked   I'm focusable!
    // 자동 상속
    button2.setFocus(true) // I got focus.
    button2.click() // I was clicked
}

 

반응형

Designed by JB FACTORY