[kotlin] 코틀린에서 상속과 인터페이스를 혼동하기 쉬운 경우

상속과 인터페이스는 객체 지향 프로그래밍에서 중요한 개념입니다. 하지만 때로는 코틀린에서 이 둘을 혼동하기 쉬울 수 있습니다. 이번 블로그 포스트에서는 코틀린에서 상속과 인터페이스를 혼동하기 쉬운 경우에 대해 살펴보겠습니다.

상속과 인터페이스의 개념 이해

먼저 상속과 인터페이스의 개념을 간단히 정리해보겠습니다.

상속 (Inheritance)

상속은 부모 클래스의 특성을 자식 클래스가 물려받는 개념입니다. 즉, 부모 클래스의 멤버 변수와 메서드를 자식 클래스에서 사용할 수 있게 됩니다. 상속은 : 기호를 사용하여 표현합니다.

open class Shape {
    open fun draw() {
        println("Drawing a shape.")
    }
}

class Circle : Shape() {
    override fun draw() {
        println("Drawing a circle.")
    }
}

위의 예제에서 Shape 클래스를 상속받은 Circle 클래스는 draw() 메서드를 오버라이딩하여 원을 그리는 기능을 추가합니다.

인터페이스 (Interface)

인터페이스는 클래스가 구현해야 하는 메서드의 목록을 정의하는 개념입니다. 인터페이스는 interface 키워드를 사용하여 정의하며, 구현해야 할 메서드를 선언합니다.

interface Drawable {
    fun draw()
}

class Circle : Drawable {
    override fun draw() {
        println("Drawing a circle.")
    }
}

위의 예제에서 Drawable 인터페이스는 draw() 메서드를 정의하고, Circle 클래스는 Drawable 인터페이스를 구현하여 원을 그리는 기능을 추가합니다.

상속과 인터페이스의 혼동하기 쉬운 경우

코틀린에서 상속과 인터페이스를 혼동하기 쉬운 경우는 주로 다음과 같은 상황에서 발생합니다.

클래스 상속과 인터페이스 구현을 함께 사용하는 경우

코틀린에서는 클래스가 하나만 상속할 수 있지만, 여러 개의 인터페이스를 구현할 수 있습니다. 때로는 클래스를 상속받고 동시에 인터페이스를 구현하는 경우가 있는데, 이 때 어떤 것이 상속이고 어떤 것이 인터페이스인지 혼동될 수 있습니다.

open class Shape {
    open fun draw() {
        println("Drawing a shape.")
    }
}

interface Paintable {
    fun paint()
}

class Circle : Shape(), Paintable {
    override fun draw() {
        println("Drawing a circle.")
    }

    override fun paint() {
        println("Painting the circle.")
    }
}

위의 예제에서 Circle 클래스는 Shape 클래스를 상속받고, Paintable 인터페이스를 구현합니다. 이렇게 상속과 인터페이스를 함께 사용하는 경우, 어떤 것이 상속이고 어떤 것이 인터페이스인지 구분하기 어려울 수 있습니다.

인터페이스의 추상 클래스와의 혼동

인터페이스는 추상 클래스와 동일한 역할을 수행할 수 있습니다. 때로는 인터페이스가 추상 클래스와 유사한 모습을 보이기 때문에, 이 둘을 혼동하기 쉽습니다.

interface Drawable {
    fun draw()
}

abstract class AbstractDrawable : Drawable {
    override fun draw() {
        println("Drawing something.")
    }
}

class Circle : AbstractDrawable() {
    override fun draw() {
        println("Drawing a circle.")
    }
}

위의 예제에서 AbstractDrawable 클래스는 Drawable 인터페이스를 구현하고, Circle 클래스는 AbstractDrawable 클래스를 상속받습니다. 이때 AbstractDrawable 클래스는 추상 클래스이지만, Drawable 인터페이스 또한 구현하고 있어서 인터페이스와 추상 클래스를 혼동할 수 있습니다.

결론

코틀린에서 상속과 인터페이스를 혼동하기 쉬운 경우에 대해 살펴보았습니다. 이러한 혼동을 피하기 위해서는 상속과 인터페이스의 개념을 명확히 이해하고, 적절하게 활용하는 것이 중요합니다. 상속은 클래스간의 관계를 표현하고 공통된 기능을 재사용하기 위해 사용되며, 인터페이스는 클래스가 구현해야 하는 메서드의 목록을 정의하기 위해 사용됩니다.