Kotlin

Kotlin - 상속과 다형성

J_Bin 2022. 6. 14. 11:24

# 파생 클래스 선언

package chap02.section1


/* 파생 클래스 생선*/

// 1. 상속 가능한 클래스를 선언하기 위해 open 사용
open class Bird (var name : String, var wing : Int, var beak : String, var color : String){

    // 메서드 정의
    fun fly() = println("Fly wing : $wing")
    fun sing(vol : Int) = println("Sing vol : $vol")

}

// 2. 주 생성자를 사용하는 상속
class Lark(name : String, wing : Int, beak : String, color: String) : Bird(name,wing,beak, color){
    // Lark 클래스의 메서드 선언(Lark 인스턴스만 사용가능)
    fun singHitone() = println("Happy Song!")
}

// 3. 부 생성자를 사용하는 상속
class Parrot : Bird{            // class Parrot은 class Bird를 상속받는다.
    val language : String       // class Parrot의 새로운 프로퍼티로 language 추가

    // super : 상위 클래스의 메서드,프로퍼티,생성자를 사용하겠다는 키워드
    // Parrot의 생성자 선언 (name,wing,beak,color는 상위 클래스의 프로퍼티를 사용하겠다 - super)
    constructor(name : String, wing: Int, beak: String, color: String, language : String) : super(name,wing,beak,color){
        this.language = language
    }

    // Parrot 클래스의 메서드 선언(Parrot 인스턴스만 사용가능)
    fun speak() = println("Speak! $language")
}


fun main(){

    val coco = Bird("mybird",2,"short","blue")
    val lark = Lark("mylark",2,"long","brown")
    val parrot = Parrot("myparrot",2,"short","multiple","korean")       // 프로퍼티 추가

    println("Coco : ${coco.name}, ${coco.wing}, ${coco.beak}, ${coco.color}")
    println("Lark : ${lark.name}, ${lark.wing}, ${lark.beak}, ${lark.color}")
    println("Parrot : ${parrot.name}, ${parrot.wing}, ${parrot.beak}, ${parrot.color}, ${parrot.language}")

    coco.sing(3)
    lark.singHitone()       // 새로 추가한 메서드 사용
    parrot.speak()          // 새로 추가한 메서드 사용
    parrot.sing(3)
    lark.fly()




}

 

# 오버로딩 : 동일한 클래스 안에서 같은 이름의 메서드가 매개변수만 달리해서 여러 번 정의 될 수 있는 개념

package chap02.section1


fun main(){

    val calc = Calc()

    println(calc.add(3,2))                                          // 1번째 add 메서드 호출
    println(calc.add(3.2,1.3))                                      // 2번째 add 메서드 호출
    println(calc.add(3,3,2))                                     // 3번째 add 메서드 호출
    println(calc.add("hello","world"))                              // 4번째 add 메서드 호출

}

class Calc{
    fun add(x: Int, y: Int) : Int = x + y                               // 1번째 add 메서드
    fun add(x: Double, y: Double) : Double = x + y                      // 2번째 add 메서드
    fun add(x: Int, y: Int, z: Int) : Int = x + y + z                   // 2번째 add 메서드
    fun add(x: String, y: String) : String = x + y                      // 4번째 add 메서드
}

 

# 오버라이딩 : 하위 클래스에서 상위 클래스의 메서드와 같은 이름으로 메서드를 정의 할 때 내용을 새로 만들어 재정의 하는 개념

 

package chap02.section1

/* 메서드 오버라이딩 */

open class Bird(var name : String, var wing : Int, var beak : String, var color : String){

    // 메서드 정의
    fun fly() = println("Fly wing : $wing")
    open fun sing(vol : Int) = println("Sing vol : $vol")       // 오버라이딩 가능한 메서드 (open 키워드)

}

class Parrot(name : String, wing : Int = 2, beak: String, color: String, var language : String = "natural") : Bird(name,wing, beak, color){

    fun speak() = println("Speak! $language")       // Parrot의 메서드 정의

    override fun sing(vol : Int){       // Bird class의 sing 메서드를 오버라이딩
        println("I'm a Parrot! The Volume level is $vol")
        speak()
    }
}

fun main(){
    val parrot = Parrot(name = "myparrot",beak = "short", color = "multiple")       // Parrot 객체 생성
    parrot.language = "English"     // language 프로퍼티 재선언

    println("Parrot : ${parrot.name}, ${parrot.wing}, ${parrot.beak}, ${parrot.color}, ${parrot.language}")
    parrot.sing(5)      // 오버라이딩 된 메서드 호출





}

'Kotlin' 카테고리의 다른 글

Kotlin - 인터페이스  (0) 2022.06.14
Kotlin - super와 this  (0) 2022.06.14
Kotlin - 클래스 , 생성자  (0) 2022.06.14
Kotlin - Try~Catch  (0) 2022.06.14
함수형 프로그래밍 #2 ★  (0) 2022.06.13