Develop!/Kotlin

오버로딩(OverLoading) in Kotlin

체리필터 2023. 8. 18. 11:26
728x90
반응형

Java에서도 overloading을 사용하게 되면 같은 이름으로 다른 파라미터를 받으면서 사용할 수 있게 된다. 이렇게 함으로 추상화가 가능하게 되고 코드를 읽는 사람에게는 더 쉽게 읽히는 순 기능이 있다. 코틀린에서는 다음과 같이 사용 하게 된다.

class Overloading() {
    fun f() = 0
    fun f(n: Int) = n + 2
}

fun overloading() {
    val o = Overloading()
    println(o.f())
    println(o.f(11))
}

실행 결과는 아래와 같다.

f라는 함수에 n이라는 파라미터를 받는 경우와 아닌 경우를 만들었다. 함수 이름과 파라미터 목록, 반환 타입을 다 합쳐서 함수의 시그니쳐 라고 하는데 함수의 파라미터를 다르게 만들면 overloading을 할 수 있게 된다.

다음에 확인해 볼 것은 member 함수와 확장 함수의 우선 순위이다. 소스코드는 아래와 같다.

class My {
    fun foo() = 0
}

fun My.foo() = 1
fun My.foo(i: Int) = i + 2

fun memberOrExtension() {
    println(My().foo())
    println(My().foo(1))
}

fun withoutDefaultArgument() {
    fun f(n: Int) = n + 373
    fun f() = f(0)

    println(f())
}

My라는 Class 안에는 foo()라는 함수가 선언되어 있고 1을 반환 한다. 그리고 파라미터 i를 받는 것은 2를 더해서 반환 한다.

My Class 밖에서 memeber 함수를 재정의 하려고 하면 어떻게 될까? 실행 결과를 보면 알 수 있다.

member 함수를 재정의 성공 했다면 값이 1이 나와야 하는데 결과는 0이 나왔다. 따라서 member 함수가 더 우선시 된다는 것을 알 수 있다.

다음은 기본값의 사용과 관련된 내용이다.

fun withoutDefaultArgument() {
    fun f(n: Int) = n + 373
    fun f() = f(0)

    println(f())
}

위와 같이 하게 될 경우 f()를 호출하게 되고 f()는 f(n: Int)를 호출하게 되어 373이 출력 되게 될 것이다. 실행 결과는 아래와 같다.

하지만 코틀린에서는 이렇게 쓰는 것을 추천하지 않는다고 한다. 기본값을 이용해서 다시 만들어 볼 수 있다.

fun withDefaultArgument() {
    fun f(n: Int = 0) = n + 373

    println(f())
}

이를 실행하게 되면 결과 값은 동일 하지만 이번에는 f()라고 정의된 함수가 없기에 기본값이 정의 된 f(n: Int=0)을 호출하게 된다.

그러면 파라미터 없이 호출하게 될 경우 기본값을 지정한 것과 파라미터가 전혀 없는 것 중 어떤 것이 더 우선시 될까?

fun overloadVsDefaultArgument() {
    fun foo(n: Int = 99) = println("foo with default value, n is ${n}")
    fun foo() {
        println("foo function without argument called")
        foo(14)
    }

    foo()
}

위와 같이 만들어 두고 실행하면 결과는 아래와 같다.

결과 창에서 볼 수 있는 것 처럼 foo()를 호출하게 되면 기본값이 있는 것보다 파라미터 없이 선언된 것을 먼저 호출하는 것을 알 수 있다.

 

 

728x90
반응형

'Develop! > Kotlin' 카테고리의 다른 글

Data Class in Kotlin  (0) 2023.09.04
when in kotlin  (0) 2023.08.23
이름 붙은 인자, 가변인자 in kotlin  (0) 2023.08.16
확장함수 in kotlin  (0) 2023.08.14
Property in kotlin  (0) 2023.08.07