다형성(polymorphism)과 다중 상속(multiple inheritance)은 객체지향 프로그래밍에서 중요한 개념입니다. Kotlin의 추상 클래스를 이용하면 이 두 가지 개념을 혼용하여 유연한 객체 모델을 구현할 수 있습니다.
다형성(Polymorphism)의 개념
다형성은 같은 이름의 메서드가 서로 다른 클래스에서 다른 방식으로 동작하는 것을 말합니다. 이는 상속과 관련이 있으며, 한 클래스가 다른 클래스로부터 속성과 행위를 상속받을 때 발생합니다.
다중 상속(Multiple Inheritance)의 제약
일부 객체지향 언어들은 다중 상속을 허용하지 않습니다. 다중 상속을 사용하면 하나의 클래스가 여러 부모 클래스로부터 상속받을 수 있지만, 이로 인해 다이아몬드 문제(diamond problem)가 발생할 수 있습니다.
Kotlin의 추상 클래스
Kotlin은 단일 상속만 허용하는데, 다중 상속의 문제를 해결하기 위해 인터페이스(interface) 와 추상 클래스(abstract class) 를 제공합니다.
추상 클래스의 활용
추상 클래스는 추상 메서드(abstract method)와 구현된 메서드를 모두 포함할 수 있습니다. 따라서 추상 클래스를 상속받는 하위 클래스에서 추상 메서드를 구현하거나 오버라이드하고, 구현된 메서드를 재사용할 수 있습니다.
abstract class Shape {
abstract fun calculateArea(): Double
open fun printName() {
println("This is a shape.")
}
}
class Circle(val radius: Double) : Shape() {
override fun calculateArea(): Double {
return Math.PI * radius * radius
}
override fun printName() {
println("This is a circle.")
}
}
위의 예시에서 Shape
클래스는 추상 클래스로, calculateArea
메서드는 추상 메서드로 선언되고, printName
메서드는 구현이 되어 있습니다. 이 클래스를 상속받은 Circle
클래스는 calculateArea
메서드를 오버라이딩하고, printName
메서드도 오버라이딩하여 재정의하였습니다.
이처럼 Kotlin의 추상 클래스를 이용하면 다중 상속의 문제없이 다형성을 활용할 수 있습니다.
결론
Kotlin의 추상 클래스를 이용하여 다형성과 다중 상속의 혼용을 구현할 수 있습니다. 이를 통해 유연하고 강력한 객체 모델을 구현할 수 있으며, 한정적인 다중 상속 문제를 우회할 수 있습니다.
참고문헌: Kotlin 공식 문서