Variable number of arguments

자바와 마찬가지로 코틀린은 가변 인자를 지원한다. 가변 인자를 사용하면 함수를 호출할 때 인자 개수를 유동적으로 지정할 수 있다. 사용하려면 인자 앞에 vararg를 붙이면 된다.

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

fun main(args: Array<String>) {
    val n1 = sum(1)
    val n2 = sum(1, 2, 3, 4, 5)
    println(n1) // 1
    println(n2) // 15
}

배열을 가변인자로 넘기기

이미 존재하는 배열을 vararg 함수의 인자로 넘겨야할 때가 있다. 이 경우 배열 이름 앞에 *를 붙여주면 된다.
*spread operator라고 부른다. 기호가 별모양이라 C/C++의 포인터와 헷갈릴 수 있지만, 코틀린엔 포인터 개념이 없다.

fun showAll(vararg s: String) {
    println(s.joinToString())
}

fun main(args: Array<String>) {
    val test = arrayOf("A", "B")
    showAll(test) // error
    showAll(*test) // OK
}

만약 vararg 파라미터가 제네릭 타입일 경우, *을 생략해도 Array<out T> 타입은 인자로 받아들일 수 있다.

fun <T> asList(vararg ts: T): List<T> {
    val result = ArrayList<T>()
    for (t in ts) // ts is an Array
        result.add(t)
    return result
}

val a = arrayOf(1, 2, 3)
val list1 = asList(a) // OK
val list2 = asList(-1, 0, *a, 4) // OK

References