티스토리 뷰

1. 코틀린 인터페이스의 Default implementation 과 JAVA

코틀린의 인터페이스는 추상 메서드 뿐만이 아니라 구현이 있는 메서드 즉, Default 메서드를 정의할 수 있다. (하지만 필드(상태)는 불가능하다.) 클래스는 class 로 정의하듯 인터페이스는 interface 로 정의 한다.

interface Clickable {
    fun click()
}

위 인터페이스는 click() 이라는 추상 메서드를 정의하며 이를 구현하는 클래스는 click()을 반드시 재정의할 필요가 있다.

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

자바와 달리 콜론(:) 뒤에 확장할 클래스나 인터페이스를 붙여준다. 인터페이스 구현에는 개수 제한이 없지만 클래스의 경우 오직 하나만 가능하다.

override 변경자는 상위 클래스 또는 인터페이스의 프로퍼티 or 메서드를 재정의한다는 의미이며. 만약 상위 클래스와 겹치는 네임을 사용하고 override 를 쓰지 않는다면 겹치는 문제를 컴파일러가 미리 예방한다.

1.1. 코틀린 인터페이스에 디폴트 구현 사용

코틀린 인터페이스는 디폴트 구현이 사용가능하다. 예를 들어

interface Clickable {
    fun click()
    fun showOff() = println("I'm clickable..!")
}

showOff() 는 디폴트 구현 메서드이며 메서드 시그니처 뒤에 단지 본문을 추가하는 것으로 구현이 가능하다.

구현하는 클래스가 오버라이딩 한다면 새로 적용되지만, 그렇지 않은 경우 디폴트 구현을 따른다.

반응형

1.2. 한 클래스에서 동시에 같은 메서드 명을 포함한 인터페이스를 구현한다면?

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

만약 Clickable 외에 위와 같은 Focusable 같은 인터페이스가 존재할 때 두개를 같이 구현하는 클래스가 있다면 어떤일이 벌어질까?

만약 둘다 구현한다고 명시하는 클래스가 showOff()를 재정의하지 않으면 컴파일 오류가 발생한다.

class Button : Clickable, Focusable {
    override fun click() = println("I was clicked")
    override fun showOff() {
        super<Clickable>.showOff()
        super<Focusable>.showOff()
    }
}

그래서 그와 같은 구현을 컴파일러가 강제하는 것이기 때문에 이를 구현해준다. 이때 super 와 꺽쇄(<>)를 사용해서 해당 인터페이스를 명시하여 호출을 명시하는 방법을 사용할 수 있다.

2. JAVA 에서 코틀린 메서드가 있는 인터페이스를 구현해야할 때

코틀린은 자바 6과 호환하도록 설계되었기 때문에 인터페이스의 디폴트 메서드를 지원하지 않는다. (자바 8부터 지원)

그래서 코틀린은 디폴트 메서드가 있는 인터페이스를 일반 인터페이스 + 디폴트 메서드가 정적 메서드로 구현된 클래스를 조합해서 사용한다.

디폴트 메서드가 포함된 코틀린 인터페이스를 자바 클래스에서 상속해서 사용해야 한다면, 코틀린에서 본문을 제공하는 메서드를 포함하는 모든 메서드에 대한 본문을 작성해야만한다. (자바에서 코틀린 디폴트 메서드 구현에 의존 불가능..)

여기까지 코틀린 인터페이스와 디폴트 구현에 대해서 좀 깊게 알아보았는데, 언젠가 필요시 참고가 되길 바란다.

2020.07.22 - [Android/Kotlin] - [코틀린] typealias 예제(examples)코드

2021.04.14 - [Android/Kotlin] - [Kotlin] 코틀린 프로젝트 IntelliJ IDE 에서 GitHub 연동하기

2021.04.14 - [Android/Kotlin] - [Kotlin] 인텔리제이(IntelliJ) new package, class 없는 경우 해결

댓글
댓글쓰기 폼
네이버 이웃추가
«   2022/01   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함