개발자의 생활

상속 본문

kotlin

상속

Developer성현 2025. 8. 22. 21:56

1. 일반 class

상속을 받은 class는 상위(부모) class에 있는 메서드나 프로퍼티를 사용할 수 있으며 override를 통해 재정의를 할 수도 있습니다.

 

상속받는 방법은 Java 와 방식이 약간 다릅니다. Java에서는 class 뒤에 extends 키워드를 사용했지만 Kotlin에서는 : 기호를 사용합니다. 또한 부모 Class 도 open 키워드를 붙여주어야 상속을 할 수 있습니다. (open 이 없으면 기본으로 final 가 됩니다.)

 

사용방식과 기본값은 조금 다르지만 규칙과 사용방법은 Java 와 동일합니다.

fun main(){
    val vehicle = Vehicle(70)
    vehicle.driving()

    val car = Car(60)
    car.driving()
}

open class Vehicle(
    private val speed: Int
){
    open fun driving(){
        println("$speed km/h 의 속력으로 달린다")
    }
}

class Car(speed: Int) : Vehicle(speed)

 

Car Class 는 상속을 받은 Vehiclev Class를 상속받았기 때문에 driving 메서드를 그대로 사용할 수 있습니다.

fun main(){
    val vehicle = Vehicle(70)
    vehicle.driving()

    val car = Car(60)
    car.driving()
}

open class Vehicle(
    val speed: Int
){
    open fun driving(){
        println("$speed km/h 의 속력으로 달린다")
    }
}

class Car(speed: Int) : Vehicle(speed){

    override fun driving() {
        println("자동차가 ${super.speed} km/h 의 속력으로 달린다")
    }
}

 

위 코드에서는 Vehiclev 메소드를 Car Class에서 override로 재정의 하였습니다.

 

추가

open class Vehicle(
    open val speed: Int
){
    open fun driving(){
        println("$speed km/h 의 속력으로 달린다")
    }
}

class Car(speed: Int) : Vehicle(speed){
    override val speed: Int
        get() = if(super.speed < 60) super.speed else 60
}

Kotlin 은 생성자에 필드를 만들면 자동으로 프로퍼티가 만들어진다고 이전 블로그에서 포스팅 한적 있습니다.

즉 getter, setter 도 open 키워드를 붙여주면 재정의가 가능합니다.

 

2. 추상 class

추상 class 는 메서드 만 정의해 놓고 상속받는 class에서 구현을 강제하도록 하는 것입니다.

fun main(){
    val vehicle: Vehicle = Car(70)
    vehicle.driving()
    
}

abstract class Vehicle(
    val speed: Int
){
    abstract fun driving()
}

class Car(speed: Int) : Vehicle(speed){
    override fun driving() {
        println("자동차가 ${super.speed} 의 속력으로 달린다")
    }
}

추상 class는 Java 와 거의 동일합니다.

abstract 키워드를 사용해서 수상 class를 만들고 내부에서 동일하게 abstract 키워드를 붙여 추상메서드를 만들 수 있습니다.

이 메서드는 자식 class에서 반드시 구현체를 만들어 주어야 합니다.

abstract class Vehicle {
    abstract val speed: Int
    abstract fun driving()
}

class Car(override val speed: Int) : Vehicle(){
    override fun driving() {
        println("자동차가 $speed 의 속력으로 달린다")
    }
}

여기서 당연히 프로퍼티도 추상화가 가능합니다. 다만 생성자 부분에서는 abstract를

또한 일반 class처럼 open을 사용해서 이미 구현되어 있는 메서드도 재정의 할 수 있도록 허용할 수 있습니다.

 

3. interface

인터페이스 도 Java와 사용법은 동일합니다. 상속받을 때는 class를 상속받을 때처럼 : 을 사용하면 됩니다. 물론 인터페이스는 여러 개를 상속받을 수 있습니다.

다만 인터페이스는 생성자가 없으며 필드를 생성할 수 없습니다.

fun main(){
    val vehicle: Vehicle = Car(70)
    vehicle.driving()
    vehicle.test()

}

interface Vehicle {
    val speed: Int
    fun driving(){
        println("자동차가 $speed 의 속력으로 달린다")
    }
    fun test()
}

class Car(override val speed: Int) : Vehicle{


    override fun test() {
        println("추상메소드 입니다")
    }
}

kotlin 인터페이스에서는 는 open과 default 키워드가 없어도 자동으로 유추하여 구분을 해 줍니다.

 

Kotlin에서 class와 interface 상속 은 키워드가 조금 다를 뿐이고 사용 방식이나 규칙은 동일합니다.

 

특징  일반 class 추상 class interface
생성자 O O X
필드(backing field) O O X
인스턴스화 O X X
다중 상속 X X O
추상 메서드 X O O

일반 class, 추상 class, interface의 특징을 간단하게 정리한 표입니다.

 

 

 

이상으로 Kotlin 상속에 대한 소개를 마치겠습니다. 감사합니다.

'kotlin' 카테고리의 다른 글

중첩 클래스, 내부클래스  (0) 2025.09.08
object 키워드(정적 변수, 정적 함수)  (1) 2025.08.31
class(클래스)  (4) 2025.08.14
유용한 String 함수  (6) 2024.10.30
제네릭  (0) 2024.10.30