HOME > kotlin > basic

Kotlin - 함수에 가변인자 전달하는 방법

JSFollow10 Jun 2019

가변인자는 개수가 정해지지 않은 인자를 말합니다. 예를 들어, 아래 코드는 인자가 1개로 고정되어있습니다. 그렇기 때문에 인자를 2개로 늘리려면 코드를 변경해야 합니다.

fun printString(string : String): Unit {
  println(string)
}

fun main() {
    printString("Hello World!")
    // printString("Hello World!", "Variable arguments") => compile error, 코드 변경해야 함
}

가변인자 사용 방법

가변인자는 인자의 개수를 유동적으로 받을 수 있습니다. 가변인자를 사용한다면 인자의 개수가 변경된다고 해도 코드를 변경하지 않아도 됩니다. 아래 코드는 함수에 가변인자를 적용한 예제입니다. 인자 앞에 vararg를 선언하면 코틀린은 이 변수를 가변인자로 취급합니다. main을 보시면 printString()은 다양한 개수의 인자를 받을 수 있습니다. 가변인자는 배열처럼 인식되기 때문에 for (string in strings)처럼 사용할 수 있습니다.

fun printString(vararg strings : String): Unit {
    for (string in strings) {
        println(string)
    }
}

fun main() {
    printString("vararg1")
    printString("vararg1", "vararg2")
    printString("vararg1", "vararg2", "vararg3")
}

인자와 가변인자 함께 사용하기

가변인자를 사용할 때, 꼭 가변인자만 사용해야 하는 것은 아닙니다. 일반 인자와 섞어 쓸 수 있습니다. 아래 코드는 인자와 가변인자를 섞어 사용한 예제입니다. 인자들 중에 가변인자는 맨 마지막에 위치해야 합니다. 그렇지 않으면 몇번째 인자가 title인지 컴파일러가 알기 어렵기 때문입니다.

fun printString(title: String, vararg strings: String): Unit {
    println(title)
    for (string in strings) {
        println(string)
    }
}

fun main() {
    printString("Title", "varargs1", "varargs2", "varargs3")
}

만약 가변인자를 마지막에 사용하기 싫다면, 컴파일러가 가변인자와 일반인자를 구분할 수 있게 해줘야 합니다. 아래 코드는 가변인자가 앞에 있고, 인자가 마지막에 위치한 예제입니다. 호출할 때 일반 인자를 구분할 수 있게 명시적으로 인자의 이름을 써주었습니다.

fun printString(vararg strings: String, title: String): Unit {
    println(title)
    for (string in strings) {
        println(string)
    }
}

fun main() {
    printString("vararg1", "vararg2", "vararg3", title = "Title")
}

인자들 중 가변인자가 가운데 위치하는 경우도 위와 동일하게 적용할 수 있습니다. 첫번째 인자는 명시적으로 인자 이름을 지정해주지 않아도 컴파일러가 일반인자로 인식하기 때문에 다음과 같이 마지막 인자만 명시적으로 입력해주면 됩니다.

fun printString(prefix: String, vararg strings: String, title: String): Unit {
    println(title)
    for (string in strings) {
        println(prefix + string)
    }
}

fun main() {
    printString("prefix ", "vararg1", "vararg2", "vararg3", title = "Title")
}

배열을 가변인자로 넘기기

이미 존재하는 스트링 배열을 가변인자로 넘기고 싶을 수 있습니다. 굳이 길게 인자를 입력하고 싶지 않거든요. 이런 경우 배열 이름 앞에 *를 붙여주면 배열이 가변인자로 취급되어 전달됩니다. 아래 코드를 보시면 더 명확합니다. *를 사용하지 않을 때와 사용할 때 두가지 방식으로 함수를 호출하고 있습니다.

fun printString(vararg strings : String): Unit {
    for (string in strings) {
        println(string)
    }
}

fun main() {
    val strings = arrayOf("vararg1", "vararg2", "vararg3")
    printString(strings[0], strings[1], strings[2]) //개수가 많아지면 힘들다
    printString(*strings) // *을 붙이면 배열을 가변인자로 취급
}

참고