코틀린은 자바와 같이 인터페이스를 사용하여 클래스에 다중 상속을 구현할 수 있습니다. 이를 통해 더 유연하고 모듈화된 코드를 작성할 수 있습니다.
인터페이스 상속
코틀린에서 인터페이스를 상속하기 위해서는 :
기호를 사용합니다. 인터페이스는 기본적으로 메소드의 시그니처만을 선언하며, 구현을 제공하지 않습니다.
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()
}
}
위의 코드에서 Animal
과 Machine
인터페이스는 동일한 speak()
메소드를 가지고 있습니다. Robot
클래스에서는 speak()
메소드를 오버라이딩하여 어떤 메소드를 호출할지 결정해야 합니다. 여기서는 Animal
의 speak()
메소드를 호출하도록 하였습니다.
결론
코틀린에서 인터페이스의 상속과 오버라이딩은 클래스의 다중 상속을 가능하게 하며, 메소드 구현의 유연성을 제공합니다. 다중 상속에서 충돌이 발생하는 경우에는 오버라이딩을 통해 충돌을 해결할 수 있습니다. 이를 통해 유연하고 모듈화된 코드를 작성할 수 있습니다.