[kotlin] 코틀린에서 인터페이스의 상속과 오버라이딩 규칙

코틀린은 자바와 같이 인터페이스를 사용하여 클래스에 다중 상속을 구현할 수 있습니다. 이를 통해 더 유연하고 모듈화된 코드를 작성할 수 있습니다.

인터페이스 상속

코틀린에서 인터페이스를 상속하기 위해서는 : 기호를 사용합니다. 인터페이스는 기본적으로 메소드의 시그니처만을 선언하며, 구현을 제공하지 않습니다.

interface Animal {
    fun speak()
}

interface Mammal : Animal {
    fun run()
}

위의 코드에서 Animal 인터페이스는 speak() 메소드를 가지고 있습니다. Mammal 인터페이스는 Animal 인터페이스를 상속하며, 추가적으로 run() 메소드를 가지고 있습니다.

인터페이스 구현

인터페이스를 구현하는 클래스는 : 인터페이스명을 사용하여 인터페이스를 명시해야 합니다. 인터페이스의 모든 메소드를 구현해야 하며, 구현하지 않은 경우 컴파일 에러가 발생합니다.

class Dog : Mammal {
    override fun speak() {
        println("Bark!")
    }
    
    override fun run() {
        println("Running...")
    }
}

위의 코드에서 Dog 클래스는 Mammal 인터페이스를 구현하고 있습니다. speak() 메소드와 run() 메소드를 오버라이딩하여 각각 개 말소리를 출력하고 개의 달리기 동작을 구현하고 있습니다.

다중 상속으로 인한 충돌

다중 상속을 사용하는 경우, 두 개 이상의 인터페이스에서 동일한 메소드를 구현하는 경우 충돌이 발생할 수 있습니다. 이 경우, 클래스에서 충돌하는 메소드에 대해서 오버라이딩을 해야 합니다.

interface Animal {
    fun speak() {
        println("Animal sound")
    }
}

interface Machine {
    fun speak() {
        println("Machine sound")
    }
}

class Robot : Animal, Machine {
    override fun speak() {
        // 오버라이딩하여 어떤 메소드를 호출할지 결정
        super<Animal>.speak()
        // 또는 super<Machine>.speak()
    }
}

위의 코드에서 AnimalMachine 인터페이스는 동일한 speak() 메소드를 가지고 있습니다. Robot 클래스에서는 speak() 메소드를 오버라이딩하여 어떤 메소드를 호출할지 결정해야 합니다. 여기서는 Animalspeak() 메소드를 호출하도록 하였습니다.

결론

코틀린에서 인터페이스의 상속과 오버라이딩은 클래스의 다중 상속을 가능하게 하며, 메소드 구현의 유연성을 제공합니다. 다중 상속에서 충돌이 발생하는 경우에는 오버라이딩을 통해 충돌을 해결할 수 있습니다. 이를 통해 유연하고 모듈화된 코드를 작성할 수 있습니다.


참고자료