본문 바로가기
프로그래밍/Kotlin

[Kotlin] 가변인자를 변수로 넘기기 (변수명앞에 별표[*])

by Youngs_ 2022. 11. 10.

필자는 코틀린에서 이런저런 코드를 보다가 변수명 앞에 *가 있는걸 보고 처음엔 포인터인줄 알았다.

근데 코틀린에는 포인터가 없는걸로 알고있는데 이상해서 더 찾아보니까 가변인자를 변수로 넘기는거였더라..

좋게 정리된 포스팅이 있어 가져왔다.


 

가변인자는 개수가 정해지지 않은 인자를 말합니다. 예를 들어, 아래 코드는 인자가 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) // *을 붙이면 배열을 가변인자로 취급
}

 


출처 : https://codechacha.com/ko/kotlin-variable-arguments/

 

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

가변인자는 개수가 정해지지 않은 인자를 말합니다. 인자가 유동적이라면 인자 개수만큼 함수도 오버로딩해야 합니다. 하지만 가변인자를 이용하면 함수를 하나만 만들어도 됩니다. 예제를 통

codechacha.com

 

댓글