본문 바로가기
모바일/Kotlin

[Kotlin] 코틀린 상속

by drCode 2021. 4. 11.
728x90
반응형

안녕하세요, 이번 포스팅은 코틀린 상속에 대해 다뤄보고자 합니다.

 

drcode-devblog.tistory.com/82

 

[java] 상속

안녕하세요. 이번 포스팅은 상속에 대해 다뤄보겠습니다. 객체 지향 프로그래밍에서 상속이란? 유지보수하기 편하고 프로그램을 수정하거나 새로운 내용을 추가하는 것을 유연하게 해주는 것.

drcode-devblog.tistory.com

자바에서 상속을 다룬 적이 있는데요,

개념 관련해서는 유지보수하기 편하고 프로그램을 수정하거나 새로운 내용을 추가하는 것을 유연하게 해주는 것.

이라고 정의할 수 있겠네요.

 

어쨌든 상속을 사용하는 이유는 중복되는 코드를 줄이고자 하는 것이지요

 

open class Car100() {
    open fun drive() : String {
        return "달린다"
    }

    open fun stop() {

    }
}

class SuperCar100() : Car100() {
    override fun drive() : String {
        val run = super.drive()
        return "빨리 $run"
    }
}

class Bus100() : Car100() {

}

여기서 class 앞에 open이 있는 Car100 클래스는 클래스의 기본적인 디폴트 타입이 private입니다.

 

open으로 명시해주지 않으면 private형으로 되는 것이지요.

 

자바에서는 public인데, 코틀린에서는 open인것 같습니다.

 

fun main(args : Array<String>) {
    val superCar100 : SuperCar100 = SuperCar100()
    println(superCar100.drive())
    superCar100.stop()

    val bus100 : Bus100 = Bus100()
    println(bus100.drive())
}

이것의 실행 결과를 보면

 

빨리 달린다
달린다

 

가 출력되게 됩니다.

 

Car100 클래스를 상속받은 버스와 슈퍼카는 상속받음으로 인해 코드의 길이가 확 줄었습니다.

 

상속을 응용해보도록 하겠습니다.

 

fun main(args: Array<String>) {
    val monster = SuperMonster(100, 10)
    val night = SuperNight(130, 8)
    monster.attack(night)
    monster.bite(night)
}

// 상속이 만들어낸 특징
// - 자식 클래스는 부모 클래스의 타입이다.
// - 부모 클래스는 자식 클래스의 타입이 아니다!

open class Charactor(var hp : Int, var power : Int) {
    fun attack(charactor: Charactor , power : Int = this.power) {
        charactor.defense(power)
    }

    open fun defense(damage : Int) {
        hp -= damage
        if(hp > 0) println("${javaClass.simpleName}의 남은 체력 $hp 입니다")
        else println("사망 했습니다.")
    }
}

// 자식 클래스가 인스턴스화 되기 이ㅟ해서 부모 클래스 선행되서 인스턴스화 되어야 한다.
class SuperMonster(hp : Int, power : Int) : Charactor(hp, power) {
    fun bite(charactor: Charactor) {
        super.attack(charactor, power + 2)
    }
}

class SuperNight(hp : Int, power : Int) : Charactor(hp, power) {
    val defensePower = 2
    override fun defense(damage: Int) {
        super.defense(damage - defensePower)
    }
}

 

 

함수 앞에도 기본적으로 private이 디폴트로 붙습니다.
open을 사용하여 사용할수 있습니다.

상속받은 클래스는 override를 사용하여 함수를 재정의할 수 있습니다.
super는 상속을 해주는 클래스를 의미합니다.
super를 사용하여 좀 더 간단한 코드를 구현할 수 있습니다.

728x90
반응형

댓글