더북(TheBook)

한 호출 안에서 위치 기반 인자와 이름 붙은 인자를 함께 사용할 수도 있다. 코틀린 1.4 이전에는 이름 붙은 인자를 쓰기 시작하면 그 이후의 모든 인자에 이름을 붙여야 했다. 하지만 이 제약은 너무 심하기 때문에 코틀린 1.4부터는 이름 붙은 인자를 중간에 섞어 쓸 수 있다. 다만 이 경우에는 원래 인자가 들어가야 할 위치에 이름 붙은 인자를 지정해야 정상 처리되며, 그렇지 않은 경우 위치 기반 인자의 타입이 어긋나거나 이미 할당된 인자를 재할당하기 때문에 컴파일 오류가 발생한다. 예를 들어 문자열에서 두 문자를 서로 교환하는 함수를 생각해보자(물론 String은 불변 값이기 때문에 원본 문자열의 내용은 바뀌지 않는다).

fun swap(s: String, from: Int, to: Int): String {
  val chars = s.toCharArray() // 배열로 변환
  // 배열 원소 교환하기
  val tmp = chars[from]
  chars[from] = chars[to]
  chars[to] = tmp
  return chars.concatToString() // 문자열로 다시 변환
}

fun main() {
  println(swap("Hello", 1, 2)) // Hlelo
  println(swap("Hello", from = 1, to = 2)) // Hlelo
  println(swap("Hello", to = 3, from = 0)) // lelHo
  println(swap("Hello", 1, to = 3)) // Hlleo
  println(swap(from = 1, s = "Hello", to = 2)) // Hlelo
  // 위치 기반 인자와 이름 붙은 인자를 혼용한 경우
  println(swap(s = "Hello", 1, 2))        // 1.4 이전에는 컴파일 오류. 1.4부터는 정상
  println(swap(s = "Hello", 1, to = 2))   // 1.4 이전에는 컴파일 오류. 1.4부터는 정상
  println(swap(s = "Hello", 2, from = 1)) // error: an argument is already passed for this parameter
                                     // error: no value passed for parameter 'to'
  println(swap(1, 2, s = "Hello"))   // the integer literal does not conform to the expected type String
                                     // error: an argument is already passed for this parameter
                                     //error: no value passed for parameter 'to'
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.