프로그래밍Kotlin 개발자

Kotlin에서 'vararg'는 어떻게 작동합니까? 전달 규칙, 제한 사항, 일반적인 패턴과의 상호 작용 및 명명된 및 일반 인수 조합 시의 일반적인 문제를 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

Kotlin의 vararg 키워드는 함수가 가변적인 수의 인수를 받을 수 있게 합니다. 이는 Java의 배열과 같지만 추가적인 문법적 설탕이 있습니다.

규칙 및 제한 사항:

  • 일반 문법: fun foo(vararg numbers: Int)
  • vararg가 있는 인수는 함수의 매개변수 중 마지막이어야 합니다(그 뒤에 매개변수가 있으면 호출 시 이름이 지정되어야 함).
  • 개별 값 또는 배열을 전달할 수 있습니다(전개 연산자 * 사용).
  • vararg가 있는 함수를 이 인수의 값을 전달하지 않고 호출할 수 있습니다.

코드 예제

fun printAll(vararg strings: String) { for (s in strings) println(s) } val arr = arrayOf("a", "b", "c") printAll("one", "two") // 작동함 printAll(*arr) // 전개(배열을 풀어냄)

꼬인 질문.

하나의 함수에 두 개의 'vararg' 매개변수를 선언하거나 'vararg'를 마지막이 아닌 곳에 배치할 수 있습니까?

답변: 아니요, Kotlin에서는 함수 선언에서 오직 하나의 vararg만 사용할 수 있으며 항상 위치 인수 중 마지막이어야 합니다. 그 뒤에 일반 매개변수를 추가하면 이름으로만 전달될 수 있습니다.

예:

fun foo(vararg items: String, prefix: String) // 컴파일 오류! // 올바름: fun foo(vararg items: String, vararg items2: Int) // 컴파일 오류! // 작동함: fun foo(vararg items: String, prefix: String = "[default]") foo("a", "b", prefix = "->")

주제에 대한 세부사항을 모르고 발생한 실제 오류 예.


이야기

젊은 프로그래머는 두 개의 vararg 매개변수를 동시에 선언할 수 있다고 잘못 생각했습니다. 함수의 아키텍처는 여러 호출 레벨에서 나뉘게 되었고, 이것은 데이터 수신 로직을 재검토하고 모든 호출을 다시 작성해야 하는 리팩토링 사슬로 이어졌습니다.


이야기

Android 프로젝트에서 vararg 매개변수가 있는 함수에 배열을 전달할 때 전개 연산자 *를 사용하는 것을 잊어버렸습니다: printAll(arr) 대신 printAll(*arr)로. 결과적으로 배열의 요소 대신 객체 주소가 있는 하나의 문자열로 출력되어 논리적으로 애플리케이션이 이상하게 작동했습니다.


이야기

vararg와 추가 명명된 매개변수가 있는 함수 fun foo(vararg a: Int, b: Int)에서 위치 인수를 통해 호출했을 때, 컴파일러는 vararg 목록이 끝나는 곳과 인수 b가 시작되는 곳을 식별할 수 없어 컴파일 오류가 발생했습니다. 그런 매개변수는 명시적으로 인수 이름을 사용하기로 결정했습니다.