References: Do it! 코틀린 프로그래밍

코틀린에서의 오버로딩(Overloading)과 오버라이딩(Overriding)에 대해 알아봅니다.

 

 

1. 다형성(Polymorphism)

 

클래스를 상속하다보면 하위 클래스에서 상위 클래스와 똑같은 이름의 프로퍼티나 메서드를 지정할 일이 생깁니다.

하위 클래스에서 이름은 같지만 호출 매개변수가 다르거나 전혀 다른 동작의 메서드를 정의할 필요가 있습니다.

이렇게 이름은 같지만 매개변수가 다르거나 다른 동작을 하도록 하는 것을 다형성(Polymorphism)이라 합니다.

 

 

2. 오버로딩(Overloading)

 

오버로딩은 같은 이름의 메서드가 매개 변수만 달리하여 여러번 재정의 되는것을 말합니다.

덧셈에 대한 오버로딩을 다음 예시를 통해 알아봅시다.

 

class Calc{
    fun add(a: Int, b: Int): Int = a + b
    fun add(a: Double, b: Double): Double = a + b
    fun add(a: Int, b: Int, c: Int): Int = a + b + c
    fun add(a: String, b: String): String = a + b
}
fun main() {
    val calc = Calc()
    println(calc.add(1, 2))
    println(calc.add(1.1, 2.2))
    println(calc.add(1, 2, 3))
    println(calc.add("Hello", "Kotlin"))
}

 

Calc 클래스 내에 add라는 동일한 이름을 가진 메서드가 4개 있습니다. 이 메서드는 모두 다른 매개변수를 갖고 있으며 이를 오버로딩이라 합니다.

위 예시의 실행 결과는 다음과 같습니다.

 

3. 오버라이딩(Overriding)

 

오버라이드는 자식 클래스가 상속 받은 부모 클래스에 있는 메서드를 재정의 하는것을 말합니다.

상속을 하는 부모클래스에는 open 키워드가, 자식 클래스에서 오버라이드 하는 함수에는 override 키워드가 사용됩니다.

 

앞서 구현한 Bird 클래스를 사용하여 오버라이드를 사용해보도록 하겠습니다.

 

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")
}
class Parrot: Bird{
    var language: String
    constructor(name: String, wing: Int = 2, beak: String, color: String, language: String = "natural"): super(name, wing, beak, color){
    this.language = language
    }
    fun speak() = println("Speak! : $language")
    override fun sing(vol: Int){
        println("I'm a parrot!")
        speak()
    }
}
fun main() {
    val parrot = Parrot(name="myParrot", beak="short", color="multiple")
    parrot.language = "English"
    parrot.sing(5)
}

 

  • 부모 클래스에서 자식클래스에 override 될 함수임을 나타내기 위해 open 키워드를 입력합니다.
  • 자식 클래스에서 오버라이드 된 함수임을 나타내기 위해 override 키워드를 입력합니다.

Parrot는 Bird에서 상속 된 클래스이며 Parrot클래스 내의 sing은 Bird클래스의 sing을 오버라이드 한 메서드 입니다.

 

위 예시의 결과값은 다음과 같습니다.

 

 

 

반응형

'Programming' 카테고리의 다른 글

[Kotlin] 25. Custom Getter & Setter  (0) 2019.08.27
[Kotlin] 24. 클래스 혹은 객체간의 관계  (0) 2019.08.27
[Kotlin] 22. 상속(Inheritance)  (0) 2019.08.24
[Kotlin] 21. 생성자  (0) 2019.08.24
[Kotlin] 20. 예외 처리  (0) 2019.08.24

+ Recent posts