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 |