For Programmer

11. 코틀린 - 상속 본문

Programming language/Kotlin

11. 코틀린 - 상속

유지광이 2021. 8. 25. 18:46

상속은 클래스의 기능을 확장하고자 할때 현재의 클래스의 기능을 모두 가지고 자신만의 기능이 추가된 새로운 클래스를 정의 하는 방법이다. 따라서 상속을 하게 되면 클래스가 상, 하의 계층구조를 가지게 되고 또 상속을 여러 단계로 할 수 있다.

 

코틀린에서 모든 클래스는 공통의 상위클래스(superclass)로 Any 클래스를 가진다. 이것이 클래스에 상위 클래스를 선언하지 않을때 가지는 기본 상위 클래스인데 다음 코드를 보면

class Good // 암시적으로 Any로 부터 상속 받음

Any 클래스 부터 모드 상속을 받고 있다고 생각하면 된다. 그래서 실제로 클래스를 만들고 ctrl+enter 를 눌러보면 Any클래스로부터 오버라이드 할 수 있는 함수 3가지가 존재한다.

class ParentCar{
    override fun equals(other: Any?): Boolean {
        return super.equals(other)
    }

    override fun hashCode(): Int {
        return super.hashCode()
    }

    override fun toString(): String {
        return super.toString()
    }
 }

그렇다면 상속을 어떻게 하면 할 수 있을까?

우선 상속 전에 알아야할 것이 Class 앞에 붙는 한정자이다.

 

  • open: 상속이 가능한 클래스로 명명함
  • final: 상속이 불가능한 클래스로 명명함. (java와 동일) - 기본값
  • abstract: 추상 클래스임 (java와 동일)

final이 기본값이기 때문에 우리는 이 한정자를 open으로 바꾸어 주어야 한다. 이러한 open 한정자를 이용해 상속을 한다. 메소드,변수 모두 상속하고 싶다면 

 

open class ParentCar(){

    open var parentInt:Int = 5


    open fun drive(){

    }

    fun stop(){

    }
}

class SuperCar100() : ParentCar(){ //상속받음

    override var parentInt: Int //속성 오버라이드
        get() = super.parentInt
        set(value) {}

    override fun drive() { //함수 오버라이드
        super.drive()
    }
    
}

-> 위의 코드에서 상속을 하고 싶은 메소드나 멤버변수(속성)가 있다면 open 접근제어자를 달아주면 된다. open제어자가 붙어있는 변수나 메소드는 자식클래스에서 오버라이드(재정의) 하여 사용할 수 있다.

 

만약 부모생성자에 매개변수가 존재한다면 다음과 같이 상속 받을 수 있다.

//방법1
open class ParentCar{

    constructor(speed:Int , model:String){
    }
    
}

class SuperCar100(var speed2: Int,var model2: String) : ParentCar(speed2,model2){ //상속받음

}

//방법2
open class ParentCar(speed:Int,model:String){

    
    
}
class SuperCar100(speed2: Int,model2: String) : ParentCar(speed2,model2){ //상속받음

}

//방법3
open class ParentCar(var speed:Int,var model:String){

    
    
}
class SuperCar100(var speed2: Int,var model2: String,var size:Int) : ParentCar(speed2,model2){ //상속받음
		//추가도 가능
}

 

상속이 일어나는 방식을 알아 봤는데 그렇다면 상속이 필요한 이유는 무엇일까?

 

class MyCar{
    fun drive(){

    }

    fun stop(){

    }
}

class MyBus{
    fun drive(){

    }

    fun stop(){

    }
}

class MySuperCar{
    fun drive(){

    }

    fun stop(){

    }
}

class MyTruck{
    fun drive(){

    }

    fun stop(){

    }
}

-> 다음과 같은 코드를 보면 상속을 받지않으면 각각의 Class마다 같은 기능들을 수십개씩 똑같은 코드로 구현해놓아야한다. 만약 위의 코드에서 Car라는 클래스에 drive,stop 함수를 정의해 놓고 상속을 받아 해당 메소드를 사용하면 코드가 굉장히 간편해 지지 않을까? 라는 생각을 해볼 수 있다.

 

 

Comments