프로그래밍 언어/코틀린

코틀린 15. 오버라이딩과 오버로딩

닉네임못짓는사람 2020. 12. 26. 00:21
반응형

이번 글에서는 오버라이딩과 오버로딩에 대해서 알아보도록 하겠습니다.

오버라이딩(overriding)


먼저 오버라이딩(overriding)에 대해서 알아볼 텐데, 이 단어의 사전적 의미를 생각해봅시다.

overriding의 뜻을 찾아보면 '재정의하다, 우선하다'라는 뜻을 가지고 있습니다.

그렇다면, 말 그대로 무언가를 재정의하거나 다른 것보다 우선한다는 의미일 것 같은데, 과연 무슨 뜻일까요?

 

프로그래밍 언어에서 overriding은 슈퍼클래스를 상속받은 서브클래스에서

슈퍼클래스에 정의되어있는 함수를 '재정의'하는 것을 의미합니다.

 

중요한 것은 overriding을 하려면 서브클래스에서 선언하려는 함수가 슈퍼클래스에

있는 함수와 이름과 형태가 동일해야 하며, 함수가 open되어있어야 한다는 점입니다.

여기서 형태라는 것은 함수의 parameter와 반환값을 의미합니다.

 

그럼 이제 코트를 통해서 overriding의 사용법을 알아보도록 할까요?

fun main() {
    var sup = Beverage()
    var sub1 = Cola()
    var sub2 = Coffee()
    println("money : ${sup.drink(2000)}")
    println("money : ${sub1.drink(2000)}")
    println("money : ${sub2.drink(2000)}")
}

open class Beverage(){
   open fun drink(money: Int): Int{
       println("슈퍼클래스의 drink함수")
       return money
   }
}

class Cola() : Beverage(){
    var price = 1500
    override fun drink(money: Int): Int{
        println("콜라를 마십니다.")
        return money - this.price
    }
}

class Coffee() : Beverage(){
    var price = 1000
    override fun drink(money: Int): Int{
        println("커피를 마십니다.")
        return money - this.price
    }
}

일단, 상속을 받기 위해서는 슈퍼클래스를 open클래스로 만들어야 합니다.

그리고 overriding하려는 함수 또한 open함수로 만들어주셔야 하는데, 이게 첫 단계입니다.

 

그리고 서브클래스에서 오버라이딩하려는 함수와 동일한 이름과 형태를 가진 함수를 새로 정의하여

자신이 원하는 동작을 수행하도록 바꿔주시면 되는 겁니다.

 

위의 코드에서는 Beverage라는 클래스를 Cola와 Coffee클래스가 각각 상속받아

drink라는 함수를 서로 다르게 overriding한 것을 볼 수 있습니다.

이렇게 상속과 overriding을 통해서 클래스를 확장하여 기능을 추가하는 것이 가능합니다.

오버로딩(overloading)


그러면 다음에는 overloading에 대해서 알아보도록 할 텐데, 먼저 사전적 의미에 대해 알아봅시다.

overloading은 과적하다. 라는 뜻을 가지고 있는데요. 과연 어떤 의미인지 확인해볼까요?

 

overriding이 같은 이름과 형태의 함수를 새롭게 재정의하는 것이라면,

overloading은 이름은 같지만 형태를 다르게 하여 함수를 여러 개 선언하는 것입니다.

 

예를 들어 fun1이라는 함수명을 생각해볼 때, 이름은 같지만 매개변수를 다르게 해서

fun1이라는 함수를 2개, 3개도 만들 수 있는 것이지요.

또한 overloading은 overriding과 달리 딱히 상속을 받을 필요가 있는 건 아닙니다.

 

바로 코드로 확인해보도록 합시다.

fun main() {
    fun add(a: Int, b: Int) = a+b
    fun add(a: Int, b: Int, c: Int) = a+b+c
    fun add(a: Int, b: Char){
        println("${a}와 ${b} 1번")
    }
    fun add(a: Char, b: Int){
        println("${a}와 ${b} 2번")
    }
    
    println(add(1, 2))
    println(add(3, 4, 5))
    add(1, 'a')
    add('a', 1)
}

이렇게 총 4개의 동일한 이름을 가진 add함수를 정의했지만, parameter의 형태에 따라 모두 다른 함수로 인식되는 것을 볼 수 있습니다.

overloading의 조건은 다음과 같습니다.

1. 함수 이름이 같아야 한다.

2. parameter의 개수 또는 자료형 또는 순서가 달라야 한다.

3. 반환타입은 overloading의 여부에 관련이 없다.

즉, overloading은 같은 함수명일 때 오직 parameter로만 구분될 수 있다는 것입니다.

 

위의 코드에서는 매개변수의 개수, 자료형, 순서가 다른 세 가지 경우를 모두 보여드렸습니다.

오버로딩의 장점은 아무래도 함수명을 절약할 수 있다는 점과 parameter차이로

다양한 작업을 처리할 수 있다는 점일 것입니다.

 

코딩을 하다 보면 변수명이나 함수명을 정할 때 고민이 많이 되는데, 이러한 불편한 점을 조금 덜어줄 수도 있겠네요.

동일한 작업을 하지만 약간의 차이가 있는 함수를 일일이 다른 함수명으로 만들기는 너무 힘들 것 같지 않나요?

 

이렇게 overriding과 overloading에 대해서 알아보았습니다.

둘 다 유용하게 사용되는 개념이기 때문에 확실히 알아두시면 좋을 것 같습니다.

이번 글은 이 정도로 마치도록 하겠습니다.

감사합니다.

반응형

'프로그래밍 언어 > 코틀린' 카테고리의 다른 글

코틀린 17. const와 상수  (0) 2020.12.26
코틀린 16. 추상화  (0) 2020.12.26
코트린 14. 상속  (0) 2020.12.25
코틀린 13. 생성자  (0) 2020.12.24
코틀린 12. 클래스  (0) 2020.12.24