클래스 계층 정의
인터페이스
코틀린 인터페이스 안에는 추상 메서드뿐 아니라 구현이 있는 메서드도 정의할 수 있다.
상태(필드)는 들어갈 수 없다.
//인터페이스 정의
interface Clickable {
fun click()
}
//인터페이스 구현
class Button : Clickable { //코틀린은 클래스 확장과 인터페이스 구현 모두 콜론(:)을 붙인다.
//오버라이드 표시
override fun click() = println("I was clicked")
}
자바와 마찬가지로 인터페이스는 개수 제한없이 마음대로 구현할 수 있지만, 클래스는 오직 하나만 확장할 수 있다.
상위 클래스에 있는 메서드와 시그니처가 같은 메서드를 우연히 하위 클래스에 선언하는 경우, 컴파일이 안 되기 때문에 override를 붙이거나 메서드 이름을 바꿔야 한다.
예시
interface Clickable {
fun click()
fun showOff() = println("I'm clickable!") //디폴트 구현 정의
}
interface Focusable {
fun setFocus(b: Boolean) =
println("I ${if (b) "got" else "lost"} focus.")
fun showOff() = println("I'm focusable!")
}
클래스가 구현하는 두 상위 인터페이스에 정의된 showOff 구현을 대체할 오버라이딩 메서드를 직접 제공하지 않으면 컴파일 오류가 발생한다.
이름과 시그니처가 같은 멤버 메서드에 대해 둘 이상의 디폴트 구현이 있는 경우, 인터페이스를 구현하는 하위 클래스에서 명시적으로 새로운 구현을 제공해야 한다.
```kotlin
class Button : Clickable, Focusable {
override fun click() = println(“I was clicked”)