Develop!/Kotlin

가변인자 목록 in Kotlin

체리필터 2023. 8. 2. 11:10
728x90
반응형

Java에서도 인자 값의 개수를 정해 놓지 않고 받을 경우 사용하는 문법이 있다. 가령 "String...str"와 같은 방식이다.

Kotlin에서는 varargs 라는 예약어를 사용하면 된다.

fun v(s: String, vararg d: Double) {
    println("String : $s")
    for (n in d) {
        print("$n ")
    }
    println();
}

fun main() {
    v("abc", 1.0, 2.0)
    v("def", 1.0, 2.0, 3.0, 4.0)
    v("ghi", 1.0, 2.0, 3.0, 4.0, 5.0, 6.0)
}

varargs로 정의 된 인자값은 Array로 인식된다. kotlin에서 Array는 Java에서의 array와 같다.

varargs로 정의하여 Array로 받아 들인 인자값을 List 처럼 사용하게 되면 어떻게 될까?

fun varargLikeList(vararg ints: Int) {
    println("Size: ${ints.size}\n" +
            "Sum: ${ints.sum()}\n" +
            "Average: ${ints.average()}")
}

fun main() {
    varargLikeList(10, -3, 8, 1, 9)
}

List 처럼 동작함을 볼 수 있다.

vararg로 인자를 받는 곳이라면 Array 타입으로 인자를 넘길 수 있다. 하지만 실제 Array를 넘기는 것이 아니라 안에 들어 있는 값을 풀어서 넘겨 줘야 하는데 이 때는 스프레드 연산자 * 를 사용해야 한다.

fun spreadOperator() {
    val array = intArrayOf(4, 5)
    println(sum(1, 2, 3, *array, 6))

    val list = listOf(9, 10, 11)
    println(sum(*list.toIntArray()))
}

fun sum(vararg numbers: Int): Int {
    var total = 0
    for (n in numbers) {
        total += n
    }

    return total
}

fun main() {
    spreadOperator()
}

위와 같이 array 변수에 담은 4, 5의 Array를 죽 펼쳐서 sum 함수에 값을 전달할 수 있다.

콘솔에서 인자값을 넘겨 받을 수도 있다. 이럴 때도 여러개의 인자를 받을 수 있는데 이 때는 main 함수의 인자를 Array로 받으면 된다.

fun main(args: Array<String>) {
    for (a in args) {
        println(a)
    }
}

위와 같이 하게 되면 String으로 된 인자 여러개를 받아 들이겠다는 말이 된다.

intellij에서 실행하게 될 경우 실행 옵션을 다음과 같은 곳에서 수정해 주면 된다.

"Edit Configurations..."를 누르게 되면 다음과 같이 나오게 되는데, 여기서 program arguments에 한 칸씩 띄어서 입력하면 된다.

실행 결과는 다음과 같다.

 

728x90
반응형

'Develop! > Kotlin' 카테고리의 다른 글

Map in Kotlin  (0) 2023.08.04
Set in Kotlin  (0) 2023.08.02
list int kotlin  (0) 2023.07.31
생성자 in kotlin  (0) 2023.07.27
'in' in kotlin  (0) 2023.07.26