Kotlin/ 상속

yellow·2021년 4월 14일
0

Kotlin

목록 보기
11/13

상속

  • 부모 클래스의 프로퍼티와 기능(멤버 함수)를 물려받는다.
  • 똑같은 코드가 반복되는 것을 방지한다.
  • kotlin에서 클래스와 메서드는 기본적으로 final이기 때문에, 상속을 허용하려면 해당 클래스 앞에 open 키워드를 붙여야 한다.
    (오버라이드를 허용하고 싶은 메서드나 프로퍼티에도 마찬가지)
  • 자식 클래스가 인스턴스화 되기 위해서는 부모 클래스가 인스턴스화 되는 것이 선행되어야 한다.
  • 부모 클래스의 생성자에 있는 파라미터들은 자식 클래스의 생성자에 val/var키워드를 빼고 파라미터로 넣어줘야 한다.
  • 예시
open class Car(engine: String, body: String){
	fun drive(){
    
    	}
        fun stop(){
        
        }
}

class SuperCar(engine: String, body: String): Car(engine, body){
	
}

📌 오버라이딩

  • 자식 클래스에서 부모 클래스의 멤버함수를 조금 수정해서 사용하고 싶을 때
  • 해당 멤버함수의 접근 제어자를 open으로 만들어준다.
  • 해당 멤버함수를 override 키워드를 써서 오버라이딩 해준다.
  • 여기서 super는 부모클래스를 가리킨다.
open class Car(engine: String, body: String){
	open fun drive(): String{
    		return "달린다."
    	}
        fun stop(){
        
        }
}

class SuperCar(engine: String, body: String): Car(){
	override fun drive(): String{
    		val run = super.drive()
            	return "빨리 $run"
    	}
}

상속 연습문제

Charactor 클래스 : 부모 클래스 -> attack과 defense 가능
SuperNight 클래스 : Charactor를 상속받는 자식 클래스
SuperMonster 클래스 : Charactor를 상속받는 자식 클래스 + bite 가능

// 부모 클래스이므로 open 키워드 사용
open class Charactor(var hp: Int, val power: Int){
    fun attack(charactor: Charactor, power: Int = this.power){
        charactor.defense(power)
    }

    // SuperNight클래스에서 오버라이딩 하기 때문에 open 키워드 사용
    open fun defense(damage: Int){
        hp -= damage
        if(hp > 0) println("${javaClass.simpleName}의 남은 체력 : $hp")
        else println("사망했습니다.")
    }
}

class SuperNight(hp: Int, power: Int): Charactor(hp, power){
    val defensePower = 2
    
    // 부모 클래스의 defense 오버라이딩
    override fun defense(damage: Int) {
        super.defense(damage - defensePower)
    }
}

class SuperMonster(hp: Int, power: Int): Charactor(hp, power){
    // SuperMonster의 추가 기능 bite
    fun bite(charactor: Charactor){
        super.attack(charactor, power + 2)
    }
}

fun main(args: Array<String>){
    val monster = SuperMonster(100, 10)
    val night = SuperNight(200, 8)

    monster.attack(night)
    monster.bite(night)
}

클래스 이름 불러오는 방법

  • ${javaClass.SimpleName}
  • 메세지를 출력할 때 클래스의 이름이 필요한 경우에 사용
  • 예시
if(hp > 0) println("${javaClass.simpleName}의 남은 체력 : $hp")
profile
할 수 있어! :)

0개의 댓글