[kotlin] 코틀린에서 추상 클래스와 인터페이스의 차이점

추상 클래스는 abstract 키워드를 사용하여 정의됩니다. 추상 메서드뿐만 아니라 일반 메서드도 포함할 수 있으며, 구현되어 있는 메서드도 포함할 수 있습니다. 하지만 추상 클래스를 상속하면, 하위 클래스에서는 추상 메서드를 반드시 구현해야 합니다. 일반적으로 추상 클래스는 상속 관계에서 공통된 코드를 추출하여 재사용할 때 사용됩니다.

인터페이스는 interface 키워드를 사용하여 정의됩니다. 인터페이스는 메서드의 시그니처만 가지며, 구현 상세는 포함하지 않습니다. 인터페이스를 구현하는 클래스는 인터페이스의 모든 메서드를 반드시 구현해야 합니다. 이를 통해 클래스는 여러 개의 인터페이스를 동시에 구현할 수 있고, 다중 상속을 이용할 수 있습니다. 일반적으로 인터페이스는 서로 다른 클래스 간의 관계를 맺을 때 사용됩니다.

추상 클래스는 일반적으로 공통된 코드를 추출하여 재사용하고, 인터페이스는 클래스 간의 관계를 맺을 때 사용됩니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있습니다. 따라서 코틀린에서는 추상 클래스와 인터페이스를 적절하게 선택하여 사용하는 것이 중요합니다.

추상 클래스와 인터페이스를 사용하는 몇 가지 예시와 함께 살펴보겠습니다:

// 추상 클래스 예시
abstract class Animal {
    abstract fun sound()
    fun sleep() {
        println("Zzzzzz")
    }
}

class Dog : Animal() {
    override fun sound() {
        println("멍멍")
    }
}

// 인터페이스 예시
interface Animal {
    fun sound()
    fun eat()
}

class Cat : Animal {
    override fun sound() {
        println("야옹")
    }
    
    override fun eat() {
        println("생선을 먹습니다")
    }
}

fun main() {
    val dog = Dog()
    dog.sound() // 멍멍
    dog.sleep() // Zzzzzz
    
    val cat = Cat()
    cat.sound() // 야옹
    cat.eat() // 생선을 먹습니다
}

추상 클래스 Animal은 추상 메서드인 sound()를 가지고 있으며, 일반 메서드인 sleep()도 포함하고 있습니다. 이 클래스를 상속받는 Dog 클래스는 sound() 메서드를 구현해야 합니다.

인터페이스 Animalsound()eat() 메서드를 가지고 있습니다. 이 인터페이스를 구현하는 Cat 클래스는 모든 메서드를 구현해야 합니다.

주어진 예시에서 추상 클래스 Animal은 공통된 sleep() 메서드를 재사용할 수 있습니다. 인터페이스 AnimalCat 클래스와 다른 클래스 간의 관계를 맺을 수 있도록 도와줍니다.