자바에서는 타입 뒤에 ...을 붙여 가변인자를 받을 수 있습니다

 

public void myMethod(String... strings){
    // method body
}

이런 식이죠

 

fun sum(vararg xs: Int): Int = xs.sum()

코틀린은 ... 대신 vararg를 씁니다

호출할 때도 약간의 차이점이 있는데, 배열을 넘기는 경우 자바는 그냥 배열을 넘기면 됐지만 코틀린에서는 배열을 풀어서 각 원소들을 넘겨줘야 합니다.

그 때 사용하는게 바로 스프레드 연산자(spread operator) * 입니다

 

val numbers = intArrayOf(1, 2, 3, 4)
val summation = sum(*numbers)

이런식으로 씁니다

 

함수 파라미터로 vararg는 최대 하나까지만 사용 가능합니다.

 

fun createUser(vararg roles: String, username: String, age: Int) {
    // ...
}

재밌는 점은 보통 프로그래밍 언어(ex. 파이썬, 자바, C 등)에서는 가변인자를 맨 뒤에 써야 하는데, 코틀린에서는 꼭 맨 뒤에 쓰지는 않아도 됩니다.

 

createUser("admin", "user", username = "me", age = 42)  // OK
// createUser("admin", "user", "me", 42)  // NO

하지만 vararg를 맨 뒤에 쓰지 않는다면 vararg를 제외한 다른 파라미터를 지정해서 호출해야 합니다. 그렇지 않으면 컴파일 에러가 발생합니다

 

바이트코드를 보면 컴파일할 때 vararg를 단순히 배열로 바꾸는 방식이라고 하네요

 

Reference

- https://www.baeldung.com/kotlin/varargs-spread-operator

반응형