더북(TheBook)

하지만 이때 얕은(shallow) 복사가 이뤄진다. 즉, 배열 내부에 참조가 들어있는 경우에는 참조가 복사되기 때문에 참조가 가리키는 데이터가 호출하는 쪽과 함수 내부 배열에서 공유된다.

fun change(vararg items: IntArray) {
  items[0][0] = 100
}

fun main() {
  val a = intArrayOf(1, 2, 3)
  val b = intArrayOf(4, 5, 6)
  change(a, b)
  println(a.contentToString()) // [100, 2, 3]
  println(b.contentToString()) // [4, 5, 6]
}

둘 이상을 vararg 파라미터로 선언하는 것은 금지된다. 하지만 vararg 파라미터에 콤마로 분리한 여러 인자와 스프레드를 섞어서 전달하는 것은 괜찮다. 호출 시 이런 호출은 원래의 순서가 유지되는 단일 배열로 합쳐진다.

printSorted(6, 1, *intArrayOf(3, 8), 2) // 6,1,3,8,2 순서로 원소가 들어있는 배열이 전달되고, [1, 2, 3, 6, 8]이 반환됨

vararg 파라미터가 맨 마지막에 있는 파라미터가 아니라면, vararg 파라미터 이후의 파라미터는 이름 붙은 인자로만 전달할 수 있다. 디폴트 값과 비슷하게 vararg 파라미터도 파라미터 목록의 맨 뒤에 위치시키는 것이 좋은 코딩 스타일이다. vararg 파라미터를 이름 붙은 인자로 전달할 수는 없다. 단, 이름 붙은 인자에 스프레드를 사용해서 가변 인자를 전달할 수는 있다.

printSorted(items = *intArrayOf(1, 2, 3))
printSorted(items = 1, 2, 3) // Error: assigning single elements to varargs in named form is forbidden 
                             // Error: the integer literal does not conform to the expected type IntArray   
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.