코틀린은 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
}
추상 클래스 Animal
은 makeSound()
와 eat()
메서드를 가지고 있습니다. 인터페이스 Runnable
은 run()
메서드를 정의합니다. Cat
클래스는 Animal
클래스를 상속하고 Runnable
인터페이스를 구현합니다. 이렇게 함으로써 Cat
클래스는 makeSound()
, eat()
, run()
을 구현하게 됩니다.
더 많은 정보를 원하신다면 코틀린 공식 문서를 참고하시기 바랍니다.