본문 바로가기

kotlin

Function : VARIABLE ARGUMENT

Function : VARIABLE ARGUMENT


Variable Arguments

Variable Arguments 는 가변 인자 함수이다. 파라메터가 몇개가 들어오든간에 상관없이 가변적으로 파라메터의 값을 가질 수 있는것이다. 

vararg제한자는 함수의 마지막 인자를 대상으로하는것을 권장하며, 오직 한개의 인자만 가변인자가 될 수 있다.

예를들어 아래의 식을 보면

var nums : IntArray = intArrayOf(1,2,3)

intArraayOf 에 1,2,3 이 들어가 있다 하지만 1개혹은 없어도 이 함수는 동작한다.

koltin에서 ~Of 라고 들어가는 함수들은 전부 가변 인자 함수로 이루어져 있다.

/**
* Returns an array containing the specified [Int] numbers.
*/
public fun intArrayOf(vararg elements: Int): IntArray


intArrayOf함수를 들어가보면 파라메터에 vararg 라는 키워드가 붙어있는것을 볼 수 있다.

이제 직접 만들어 보자

fun varargFunction(vararg number : Int){

}

함수이름을 varargFunction 이라하고 int 형의 파라메터값을 사용하는데 vararg 를 붙여 가변인자를 만든다. 이때 number는 배열처럼 취급한다.

init {
var nums : IntArray = intArrayOf(1,2,3)
varargFunction(1,2,3)

}

fun varargFunction(vararg number : Int){
println("${number.javaClass}")
println("${number.sum()}")
println("${number.average()}")
println("${number.asList()}")
println("${number.size}")
}

위의 코드를보면 number라는 변수에 vararg라는 키워드가 붙는것을 볼 수 있는데, number의 javaclass를 찍어서 출력해보면

class [I

이와같은 출력이 나온다. class[I 는 자바의 배열이라는 뜻이다.



Spread operator

아래와 같은 코드가 있다. 이 코드는 vararg(가변 인자) 를 이용하여 고객의 아이스크림을 출력한다.

init {
putIceCreams("frank","체리맛","초코맛","딸기맛")

println("${basket.toList().joinToString("\n")}")

}

fun putIceCreams(customer : String, vararg ic : String){
println("${customer} ==> ${ic.joinToString(",")}")
}

가변 인자를 아래와 같이 iceList라는 배열을 선언하여 vararg 에 넣고 싶다 하지만 에러가 난다.

이유는 iceList가 배열로 감싸져 있기때문인데 여기서 배열을 풀어 이어지게 하고 싶다면 * 를 사용하여 풀어줘야한다.

val iceList = arrayOf("호박맛","치약맛","플라스틱맛")
init {
putIceCreams("frank","체리맛","초코맛","딸기맛")
putIceCreams("frank","체리맛",iceList,"딸기맛")

println("${basket.toList().joinToString("\n")}")

}

fun putIceCreams(customer : String, vararg ic : String){
println("${customer} ==> ${ic.joinToString(",")}")
}



아래와 같이 * 를 붙여서 출력해 본다면

val iceList = arrayOf("호박맛","치약맛","플라스틱맛")
init {
///putIceCreams("frank","체리맛","초코맛","딸기맛")
putIceCreams("frank","체리맛",*iceList,"딸기맛")

println("${basket.toList().joinToString("\n")}")

}

fun putIceCreams(customer : String, vararg ic : String){
println("${customer} ==> ${ic.joinToString(",")}")
}


frank ==> 체리맛,호박맛,치약맛,플라스틱맛,딸기맛

자연스럽게 이어지는 결과가 나온다


여기서 * 라는 연산자가 중요한데 *는 C언어의 포인터가 아니라 Kotlin에서 배열의 펼침 연산자 라고 한다.


즉, 가변 인자에 다른 배열을 한 요소 인자로써 입력할 때 사용된다.










'kotlin' 카테고리의 다른 글

NESTED & INNER CLASS  (0) 2018.12.12
DATA CLASS & TUPLES  (0) 2018.12.12
함수기본(Function)  (0) 2018.12.09
collection-Map  (0) 2018.12.07
For문  (0) 2018.12.06