디폴트 값이 있는 파라미터와 vararg를 섞어 쓰는 것은 어렵다. 디폴트를 vararg보다 앞에 두면 vararg 파라미터에 첫 번째로 전달돼야 하는 값이 디폴트가 지정된 파라미터에 전달될 값으로 간주된다. 이를 피하려면 vararg 파라미터를 이름 붙은 인자와 스프레드를 사용해 전달해야 한다. 하지만 이런 식으로 전달하는 코드는 원래 vararg를 도입했던 목적에 위배된다.
fun printSorted(prefix: String = "", vararg items: Int) { } fun main() { printSorted(6, 2, 10, 1) // Error: 6 is taken as value of prefix printSorted(items = *intArrayOf(6, 2, 10, 1)) // 정상 }
반면 vararg 파라미터 뒤에 디폴트 파라미터가 있는 경우에는 디폴트 파라미터를 이름 붙은 인자로 호출해야 사용할 수 있다.
fun printSorted(vararg items: Int, prefix: String = "") { } fun main() { printSorted(6, 2, 10, 1, "!") // Error: type mismatch: inferred type is // String but Int was expected printSorted(6, 2, 10, 1, prefix = "!") // 정상 }