자바에서는 타입 뒤에 ...을 붙여 가변인자를 받을 수 있습니다
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
반응형
'프로그래밍 > Kotlin' 카테고리의 다른 글
[Kotlin] local function (로컬 함수) (0) | 2022.03.26 |
---|---|
[Kotlin] infix call (중위 호출) (0) | 2022.03.26 |
[Kotlin] Extension Property (확장 프로퍼티) (0) | 2022.03.21 |
[Kotlin] Extension function (확장 함수) (0) | 2022.03.21 |
[Kotlin] map iteration with destructuring (0) | 2022.03.20 |