아래와 같이 parameter 개수가 4개인 함수가 있다고 가정해봅시다.


[코드 #1]

fun foo(a: Int = 0, b: Int = 0, c: Boolean = false, d: String = "default value") {

println("a= $a, b= $b, c= $c, d= $d")
}


Kotlin에서는 Named Arguments, Default Arguments를 통해

parameter가 개수와 관계 없이 아래와 같이 간단히 함수를 사용할 수 있습니다.


[코드 #2]

fun main(args: Array<String>) {

foo(1)
foo(b = 2)
}


[실행 결과]

a= 1, b= 0, c= false, d= default value

a= 0, b= 2, c= false, d= default value


,


Java에서는 위와 같은 결과를 내려면

아래와 같이 함수를 호출해야 하고


[코드 #3]

foo(1, 0, false, "default value");
foo(0, 2, false, "default value");


또한, 많은 parameter를 적기 싫으면 함수 오버로딩을 해야 했습니다.


,


즉, 

Default and named arguments help to minimize the number of overloads and improve the readability of the function invocation.


,



그러나 주의해야 할 점이 있습니다.

Kotlin에서 foo 함수를 호출할 때에는 [코드 #2]와 같이 해도 되지만

Java에서 foo 함수를 호출할 때에는 parameter를 모두 입력해야 합니다.


이를 해결하기 위해 @JvmOverloads annotation을 추가해주어야 합니다.


[코드 #4]

@JvmOverloads fun foo(a: Int = 0, b: Int = 0, c: Boolean = false, d: String = "default value") {

println("a= $a, b= $b, c= $c, d= $d")
}


@JvmOverloads annotaton은 다음과 같은 역할을 해줍니다.


Instructs the Kotlin compiler to generate overloads for this function that substitute default parameter values.  


If a method has N parameters and M of which have default values, M overloads are generated: the first one takes N-1 parameters (all but the last one that takes a default value), the second takes N-2 parameters, and so on.







출처 : 

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-overloads/index.html

http://kotlinlang.org/docs/reference/functions.html#default-arguments



블로그 이미지

stack.07142

IT, Android, Java, Algorithm. Kotlin, Swift, iOS

티스토리 툴바