For Programmer

12. 코틀린 - 인터페이스 본문

Programming language/Kotlin

12. 코틀린 - 인터페이스

유지광이 2021. 8. 25. 20:13
728x90

코틀린의 interface는 자바와 비슷하다.

interface Person2 {
    fun eat()
}

interface 를 구현할 때는 [클래스: 인터페이스] 형식으로 구현하며 extends(확장)과 implements(구현) 둘 다 :(콜론) 으로 구현한다.

코틀린은 자바와 똑같이 1개의 상속과 여러개의 인터페이스를 구현할 수 있다. 그리고 override 변경자를 사용해서 자바의 @Override 를 대신한다.
만약에 override 된 함수 이름과 다른 함수 이름이 중복될경우 둘중 하나는 다른 이름을 사용해야 한다.

 

코틀린은 또한 default메소드를 제공하고 있다. 이는 인터페이스 내부에서 구현할 수 있게 해주며 반드시 상속받은 클래스에서 구현할 필요가 없다.

interface Person2 {
    fun eat(){
        println("먹는다") //디폴트 값 지정
    }
    fun study() //반드시 구현
    fun run() = println("hello") //디폴트 값 지정
}

class Student2:Person2{
    override fun eat() { //구현해도 되고 안해도 됨
        println("interface를 구현한 eat메소드")
    }
    override fun study() { // 반드시 구현해야됨
        println("interface를 구현한 study")
    }
}

같은 함수 이름을 갖는 interface

디폴트 함수 이름이 같은 두개의 인터페이스를 구현해야되는 경우를 해보자.
디폴트 함수 이름이 같은 이름인 인터페이스를 정의하면 컴파일 에러가 발생한다.

 

인터페이스1

interface Person2 {
    fun eat(){
        println("먹는다")
    }
    fun sleep(){
        println("잔다")
    }
    fun study()
    fun run() = println("hello")
}

인터페이스2

interface Person3 {

    fun study()
    fun run() = println("hello")
}

인터페이스3

class Student2:Person2,Person3{

    override fun study() { // 반드시 구현해야됨
        println("interface를 구현한 study")
    }

    override fun run() {
        super<Person3>.run()
    }
}

-> study같은 경우는 2개의 인터페이스 모두에 존재하기 때문에 그리고 둘다 구현이 되어있지 않기 때문에 반드시 구현해야한다. 단, 기본적으로 디폴트 되어있는 run메소드 같은경우 인터페이스에 미리 구현한 디폴트 메소드를 선언하고 싶을 경우 무엇을 구현할지를 모르기 때문에 super<>.메소드 를 사용하여 어떤 것을 구현할것인지에 대하여 표시를 해주어야 한다.

 

 

728x90
Comments