본문 바로가기

Kotlin/Basic

가변 인자 목록: vararg

Atomic Kotlin의 Atom 25를 정리한 내용입니다.

vararg 키워드는 길이가 변할 수 있는 인자 목록을 만든다.
이 키워드를 사용하면 listOf()처럼 임의의 길이로 인자를 받을 수 있는 함수를 정의할 수 있다.
vararg는 가변 인자 목록(Variable argument list)의 줄인 말.

 

함수 정의에는 vargarg 로 정의된 인자가 최대 한개만 존재 가능하다.
파라미터 목록에서 어떤 위치에 있는 파라미터 든지 vararg로 선언 가능하지만, 일반적으로 마지막 파람을 vararg로 선언하는게 편하다.

fun v(s:String, vararg d: Double){}

 

임의의 개수만큼(0 포함) 인자 전달 가능.
모든 인자는 지정한 타입에 속해야 함
함수 본문에서는 파람 이름으로 vararg인자에 접근 가능하며 이때 Array로 취급됨.

 

Array와 List는 비슷해 보이지만 전혀 다르게 구현됨
List는 일반적인 라이르러리 클래스인 반면, Array에는 특별한 저수준 지원이 필요함.

 

Array는 자바같은 다른 언어와 호환되어야한다는 코틀린의 요구사랑에 의해 생겨난 타입

보통은 List를 사용하되, API가 Array를 요구하거나 vararg를 다루는 경우만 Array 사용 권장.

만약 vararg가 Array로 취급됨을 무시하고 아래 코드처럼 List처럼 다루면?

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

fun main(){
    evaluate(10,-3,8,1,9) eq """
        Size: 5
        Sum: 25
        Average: 5.0
    """
}

 

 

vararg가 필요한 위치에 임의의 타입 Array를 넘길 수 있다.

Array는 arrayOf()로 만듬
Array는 가변 객체라는 것을 유의할 것.
Array를 인자 목록으로 변환하고 싶으면 스프레드 연산자(*)를 사용

fun main(){
    val array = intArrayOf(4,5)
    sum(1,2,3, *array, 6) eq 21
    // 아래는 안됨
    // sum(1,2,3, array, 6) eq 21

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

스프레드 연산자는 vararg로 받은 파라미터를 다시 다른 vararg를 요구하는 함수에 전달할 때 유용하다.

fun first(vararg numbers: Int):String{
    var result = ""
    for (i in numbers){
        result += "[$i]"
    }
    return result
}

fun second(vararg numbers:Int)=
    first(*numbers)

fun main(){
    second(7,9,32) eq "[7][9][32]"
}

'Kotlin > Basic' 카테고리의 다른 글

[Kotlin] 반복문  (2) 2024.05.18
집합: Set, MutableSet  (0) 2023.12.03
[Kotlin] object & companion object  (0) 2023.01.19
[Kotlin] lateinit와 lazy의 차이점  (0) 2023.01.17
[Kotlin] 내부(Inner class)와 중첩 클래스(Nested class)  (0) 2023.01.11