[kotlin] 코틀린에서 추상 클래스와 인터페이스를 함께 사용하는 이유

코틀린은 Java와 비슷한 객체지향 프로그래밍 언어입니다. 추상 클래스와 인터페이스는 코틀린에서도 주요한 개념이며, 이들을 함께 사용하는 이유는 다음과 같습니다.

1. 코드 재사용성의 증가

추상 클래스와 인터페이스는 둘 다 클래스들 간에 공통된 기능을 정의할 수 있는 방법입니다. 추상 클래스는 메서드 구현을 가질 수 있고, 인터페이스는 메서드 선언만을 가집니다. 이 둘을 함께 사용하면, 추상 클래스에서 공통된 기능을 구현하고 인터페이스에서는 더 세부적인 기능을 정의할 수 있습니다. 이로 인해 코드의 재사용성이 증가하고 개발 시간과 노력을 절약할 수 있습니다.

2. 다중 상속의 한계 극복

Java와 달리, 코틀린은 다중 상속을 지원하지 않습니다. 하지만 추상 클래스와 인터페이스를 함께 사용하면 다중 상속을 흉내 낼 수 있습니다. 추상 클래스를 사용하여 클래스의 상속을 통해 부모 클래스에서 일부 기능을 상속받고, 인터페이스를 사용하여 다른 클래스에서 구현해야 할 기능들을 정의할 수 있습니다.

3. 관심사의 분리

인터페이스는 관심사의 분리를 도와줍니다. 클래스가 여러 개의 인터페이스를 구현하면, 각 인터페이스는 해당하는 관심사에 집중할 수 있습니다. 이렇게 하면 코드의 가독성과 유지보수성이 향상됩니다.

4. 유연한 디자인

추상 클래스와 인터페이스를 함께 사용하면 유연한 디자인을 할 수 있습니다. 추상 클래스는 구체적인 기능을 가지며, 인터페이스는 이러한 기능들을 확장하거나 추가할 수 있습니다. 이를 통해 다양한 상황에서 유연하게 디자인을 변경하고 확장할 수 있습니다.

예시 코드

// 추상 클래스
abstract class Animal {
    abstract fun makeSound()
    abstract fun eat()
}

// 인터페이스
interface Runnable {
    fun run()
}

// 클래스에서 추상 클래스를 상속하고 인터페이스를 구현
class Cat : Animal(), Runnable {
    override fun makeSound() {
        println("Meow!")
    }
    
    override fun eat() {
        println("Cat is eating")
    }
    
    override fun run() {
        println("Cat is running")
    }
}

fun main() {
    val cat = Cat()
    cat.makeSound() // Meow!
    cat.eat() // Cat is eating
    cat.run() // Cat is running
}

추상 클래스 AnimalmakeSound()eat() 메서드를 가지고 있습니다. 인터페이스 Runnablerun() 메서드를 정의합니다. Cat 클래스는 Animal 클래스를 상속하고 Runnable 인터페이스를 구현합니다. 이렇게 함으로써 Cat 클래스는 makeSound(), eat(), run()을 구현하게 됩니다.

더 많은 정보를 원하신다면 코틀린 공식 문서를 참고하시기 바랍니다.