본문 바로가기
언어/Kotlin

[Kotlin 문법 종합] - 상속

by 젼젼39 2024. 3. 5.

 

상속

    (+) 부모/자식 클래스로 구분해 공통적인 요소들을 한번에 작성 가능
    (+) 다형성 구현
    (+) 부모 클래스에서 변경한 내용이 자식 클래스에도 적용

    ** 코틀린에서는 생략된 final 키워드 때문에 기본적으로 상속이 막혀있음
        --> open 키워드로 상속관계를 만들 수 있음 

1. 부모클래스에서 생성자를 사용하지 않을 때

fun main() {
    var bird = Bird()
    var chicken = Chicken()
    var sparrow = Sparrow()
    var pigeon = Pigeon()

    bird.fly()
    chicken.fly()
    sparrow.fly()
    pigeon.fly()
}

open class Bird { 		//open을 부모 클래스 앞에 적어주기
    fun fly() {
        println("새는 날아요~")
    }
}

class Chicken : Bird() {
 		//@super 이나 override같은거 필요 없나...?
}
class Sparrow : Bird() {}
class Pigeon : Bird() {}

 

2. 부모클래스에서 생성자를 활용할 때 --> 자식클래스에서 객체 생성 시 전달해야 함

fun main() {
    var bird = Bird("새")
    var chicken = Chicken("닭")
    var sparrow = Sparrow("참새")
    var pigeon = Pigeon("비둘기")

    bird.fly()
    chicken.fly()
    sparrow.fly()
    pigeon.fly()
}

open class Bird(name:String) {
    var name: String = ""

    init {
        // this는 현재 클래스의 상태변수
        this.name = name
    }

    fun fly() {
        println("${name} 날아요~")
    }
}

class Chicken(name: String) : Bird(name) {}
class Sparrow(name: String) : Bird(name) {}
class Pigeon(name: String) : Bird(name) {}
open class Bird(var name: String, var wing: Int, var color: String){
    fun fly() = println("$wing")
    fun sing(vol: Int) = println("Sing vol: $vol")
}

주 생성자 사용 1
class Sparrow(name: String, wing: Int, color: String) : Bird(name, wing, color){
    fun talk() = println("Hi")
}

주 생성자 사용 2
class Eagle(name: String, wing: Int, color: String,
                var habit: String = "natural") : Bird(name, wing, color){
                //var habit: String 만 해도 되나??@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    fun talk() = println("Hi")
}


부 생성자 사용
class Chicken : Bird {
    val language: String
    
    constructor(name: String,
                wing: Int,
                color: String,
                language: String ) : super(name, wing, color) {
        this.language = language
    }
    fun speak() = println("$language")
}

val bird1 = Bird("bird1", 2, "blue")
val sp1 = Sparrow("sp1", 2, "rainbow")
val ch1 = Chicken("ch1", 2, "brown", "english")