한 호출 안에서 위치 기반 인자와 이름 붙은 인자를 함께 사용할 수도 있다. 코틀린 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'
    }
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.