프로그래밍/Kotlin

[코틀린 / Kotlin] 상속과 오버라이딩

pupu91 2022. 10. 20. 17:26
반응형

상속 테스트 1 

- 부모 클래스 생성

open class Animail(var name: String, var age: Int, val gender: String){

    /* 키워드 비교를 위한 속성 정의*/
    open var test1: Int = 0
    var test2: Int = 0

    /* animail이 가지는 기능 정의*/
    fun eat(food: String){
        println("${name}이(가) ${food}를(을) 먹습니다.")
    }

    fun sleep(hour: Int){
        println("${name}이(가) ${hour}시간 동안 잡니다.")
    }
}

 

 

 

- Animail을 상속 받는 자식 클래스 생성

class Rabbit(name: String, age: Int, gender: String, var location: String, var weight: Int, var kinds:String ) : Animail(name, age, gender){
 
    /* rabbit만 가지는 기능 정의*/
    fun jump(){
        println("${location}에 살고 있는 몸무게가 ${weight}kg인 ${kinds}종 토끼${name}이(가) 깡총깡총 뜁니다.")
    }
    
// name: String, age: Int, gender: String는 부모 필드 값, 
// var location: String, var weight: Int, var kinds:String 는 rabbit이 가지는 속성    
}

 

 

 

 

- 출력하기

fun main(){
   
    //이름 나이 성별은 animail에서 초기화 나머지는 rabbit에서 초기화 됨
    var rabbit = Rabbit("엽기토끼",25, "중성", "종로",100,"라이언헤드")
    rabbit.eat("햄버거")
    rabbit.sleep(5)
    rabbit.jump()
}

출력 결과
엽기토끼이(가) 햄버거를(을) 먹습니다.
엽기토끼이(가) 5시간 동안 잡니다.
종로에 살고 있는 몸무게가 100kg인 라이언헤드종 토끼엽기토끼이(가) 깡총깡총 뜁니다.

 

 

상속 테스트 2

- 부모클래스 

 

open class Parent(var parentProp: Int){

    fun parentFunc(){
        println("parent func")
    }
}

 

 

- 자식 클래스 

class Child(prop: Int, var childProp: Int) : Parent(prop){

    fun childFunc(){
        //자식 객체에서 부모 객체의 속성을 사용하기 위해서 super 활용 가능
        //부모 객체에 따로 제한 되어 있는 키워드가 없기 때문에 super 없이도 호출 가능
        println("${super.parentProp}")
        println("${parentProp}") 

        super.parentFunc()
        parentFunc()
    }
}

 

 

- 출력하기

fun main(){
   
    var p =Parent(1)
    var c = Child(2, 3) //다형성을 활용하여 아래의 코드로 바꿀 수 있음
    //Parent p = new Child(); 자바의 다형성

    var poly: Parent = Child(4, 5) //실제 객체는 child이지만, parent타입으로 저장합니다.
    poly.parentFunc()
    //poly.childFunc() parent타입이기 때문에 Child가 가지고 있는 해당 기능은 사용하지 못 함. 해결방법 : 다운 캐스팅
   
   /* is로 if문 안에 조건을 작성하면 블럭 내의 레퍼런스 변수는 다운 캐스팅 된다*/
    if(poly is Child) {//is 연산자를 사용하여 다운 캐스팅 할 수 있음
        poly.childFunc()
    }

    /* 직접 다운 캐스팅을 하기 위해서는 as 연산자를 사용한다.*/
    (poly as Child).childFunc()

}

출력 결과
parent func
4
4
parent func
parent func
4
4
parent func
parent func

 

 

오버라이딩 사용 예시

open class Parent2(){

    /* 오버라이딩 불가*/
    fun parentFun(){
        println("from parentFunc")
    }

    /* 오바라이딩 가능 / 인자 없이 생성*/
    open fun overridableParentFunc(){
        println("from overridableParentFunc")
    }
    /* 오바라이딩 가능 / 인자 ㅇ*/
    open fun overridableParentFuncWithArg(arg1: Int, arg2: String){
        println("from overriableParentFuncWithArg($arg1, $arg2)")
    }

}

class  Child2 : Parent2(){
 /* 재정의 불가. open 키워드를 붙이지 않아 final 메소드로 생성 되었다.*/
 /*   override fun parentFun(){

    }*/
    override fun overridableParentFunc() {
        println("from overrided overridableParentFunc")
    }

    override fun overridableParentFuncWithArg(arg1: Int, arg2: String) {
        super.overridableParentFuncWithArg(arg1, arg2)
        println("from overrided overriableParentFuncWithArg($arg1, $arg2)")
    }
}

fun main(){

    var p = Parent2()
    p.parentFun()
    p.overridableParentFunc()
    p.overridableParentFuncWithArg(100, "Hello")

    //var c = Child2() child2 타입
    var c: Parent2 = Child2() //다형성을 이용한 parent2 -> child2 타입이 아니지만 오버라이딩 ㅁㅔ소드가 더 우선이여서 정상적으로 호출 가능
    c.parentFun()
    c.overridableParentFunc()
    c.overridableParentFuncWithArg(200,"World")
}

출력 결과
from parentFunc
from overridableParentFunc
from overriableParentFuncWithArg(100, Hello)
from parentFunc
from overrided overridableParentFunc
from overriableParentFuncWithArg(200, World)
from overrided overriableParentFuncWithArg(200, World)
반응형