Language/Kotlin In Action

[Kotlin In Action] 인터페이스

by Donghwan 2021. 4. 22.

코틀린의 인터페이스는 자바8 인터페이스와 비슷합니다. 코틀린 인터페이스 안에는 추상 메소드뿐 아니라 구현이 있는 메소드도 정의할 수 있습니다. 자바 8의 디폴트 메소드와 비슷합니다. 다만 인터페이스에는 아무런 상태도 들어갈 수 없습니다.

자바에서는 extends와 implements 키워드를 사용하지만, 코틀린에서는 클래스 이름 뒤에 콜론(:)을 붙이고 인터페이스와 클래스 이름을 적는 것으로 클래스 확장과 인터페이스 구현을 모두 처리합니다. 자바와 마찬가지로 클래스는 인터페이스를 원하는 만큼 개수 제한 없이 마음대로 구현할 수 있지만,클래스는 오직 하나만 확장할 수 있습니다.

class 클래스이름 : 클래스A, 인터페이스A, 인터페이스B {
    ...
}

자바의 @Override 애노테이션과 비슷한 override 변경자는 상위 클래스나 상위 인터페이스에 있는 프로퍼티나 메소드를 오버라이드한다는 표시입니다. 하지만 자바와 달리 코틀린에서는 override 변경자를 꼭 사용해야 합니다.

override 변경자는 실수로 상위 클래스의 메소드를 오버라이드하는 경우를 방지해줍니다. 상위 클래스에 있는 메소드와 시그니처가 같은 메소드를 우연히 하위 클래스에서 선언하는 경우 컴파일이 안 되기 때문에 override를 붙이거나 메소드 이름을 바꿔야만 합니다.

인터페이스 메소드도 디폴트 구현을 제공할 수 있습니다. 그런 경우 메소드 앞에 default를 붙여야 하는 자바 8과 달리 코틀린에서는 메소드를 특별한 키워드로 꾸밀 필요가 없이 메소드 본문을 시그니처 뒤에 추가하면 됩니다.

인터페이스를 구현하는 클래스는 정의한 메소드에 대한 구현을 제공해야 합니다. 하지만 디폴트를 구현한 메소드는 정의를 생략해서 사용하거나 새로운 동작을 재정의 할 수 있습니다.

interface 인테페이스명 {
    fun 메소드명()
    fun 메소드명() = ""
}

만약 한 클래스에서 동일한 메소드명을 가진 두 인터페이스를 상속을 받는다면 오버라이딩 메소드를 직접 제공하지 않으면 컴파일러 오류가 발생합니다. 그렇기때문에 반드시 override 키워드를 통해 재정의를 해주어야 합니다. 만약 디폴트 구현을 가지고 있다면 아래와 같이 표현할 수 있습니다.

interface A {
    fun a() = Unit
}

interface B {
    fun a() = Unit
}

class C : A, B {
    override fun a() {
        super<A>.a()
        super<B>.a()
    }
}

//만약 두가지를 모두 사용하지 않고 한가지 메소드만 사용한다면 아래와 같이 표현이 가능합니다.
class C : A, B {
    override fun a() = super<A>.a()
}

 

[ 출처 : Kotlin In Action ]

728x90
반응형

댓글