[코틀린] 상속

나고수·2021년 9월 24일
0

kotlin

목록 보기
2/10

상속

//상속 - 부모로 부터 설명서를 물려받는다.
//class를 만들때 기본적으로 private이 붙는다. 그래서 그냥 상속받으면 syntax오류남.
//이 클래스가 더이상 private이 아니다 라는 키워드 open을 붙여줘야함.
//fun도 기본적으로 private이 붙는다. 접근허용키워드 open을 붙여줘야함.

fun main(array: Array<String>){
    val superCar100 : SuperCar100 = SuperCar100()
    //superCar100.drive()
    superCar100.stop()
    val bus100 : Bus100 = Bus100()
    println(superCar100.drive())

}

//부모 Car100
//자식 SuperCar100
open class Car100(){
    open fun drive():String{
        return "달린다"
    }
    fun stop(){

    }
}

class SuperCar100(): Car100() {
   
    override fun drive() :String{
//1. 부모의 기능을 개조
        val run = super.drive()
        return "빨리 $run"
        
//2. 부모의 기능을 무시하고 새로운 함수 만들기
        println("빨리달린다")
        //super.drive() <<기존 부모의 함수 무시
    }
}

class Truck100(): Car100(){

}

class Bus100(): Car100(){

}
package Kotlin

//과제
//Knight, Monster 부모클래스
//SuperKnight, SuperMonster 자식클래스

//상속이 만들어낸 특징
// 자식 클래스는 부모클래스의 타입이다.
// 부모 클래스는 자식 클래스의 타입이 아니다.
//ex) supercar는 car이다.
//하지만 (모든) car 가 supercar인것은 아니다.

fun main(array: Array<String>){
    val superKnight :SuperKnight = SuperKnight(130,8)
    val superMonster :SuperMonster = SuperMonster(100,10)
    //attack(Character)을 써줘야하는데, superKnight이나 superMonster을 인자로 써줘도 작동되는 이유는
    //sueprMonster나 superKnight은 Character의 자식이라, Character의 클래스이기 때문이다.
    superMonster.attack(superKnight)
    superMonster.bite(superKnight)
}

open class Character(var hp:Int, val power: Int){
    //superMonster에서는 bite함수를 쓸 때 power인자도 들어가지만
    //superKnight에서는 power인자를 쓰지 않는다.
    //따라서 디폴트 값을 넣어준다.
    fun attack(character:Character,power: Int=this.power){
        character.defense(power)
    }
    open fun defense(damage: Int){
        hp-=damage
        if(hp>0) println("${javaClass.simpleName} 남은체력 $hp 입니다.")
        else println("죽었습니다")
    }
}

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


class SuperMonster( hp: Int,  power: Int):Character(hp, power){
    fun bite(character: Character){
        super.attack(character,this.power+2)
    }
}
profile
되고싶다

0개의 댓글