가변인자란?
이름 그대로 (개수가)변할 수 있는 인자입니다..!
즉, A라는 함수에 가변인자를 사용하면 인자를 1개만 넣을 수도 2개, 3개..를 넣을 수도 있습니다.
인자의 개수가 변함에 따라 함수를 더 만들어 주거나 코드를 수정하지 않아도 된다는 뜻입니다!
가변인자 사용하기
간단하게 정수들을 가변인자로 받고 해당 정수들을 intArray로 만들어 반환하는 함수를 만들어보겠습니다.
가변인자를 사용하지 않을 경우
여러 개의 정수를 인자로 받아야하는데 인자의 개수만큼의 함수를 만들어야합니다.
ex) 인자가 1개일 경우의 함수, 2개일 경우의 함수, 3개일 경우의 함수...
fun main(){
makeIntArray(1).forEach{
print("$it ")
} // 1
println()
makeIntArray(1,2).forEach{
print("$it ")
} // 1 2
println()
makeIntArray(1,2,3).forEach{
print("$it ")
} // 1 2 3
println()
}
fun makeIntArray(int: Int): IntArray{
var array = intArrayOf()
array += int
return array
}
fun makeIntArray(firint: Int, secInt: Int): IntArray{
var array = intArrayOf()
array += firint
array += secInt
return array
}
fun makeIntArray(firint: Int, secInt: Int, thirdInt: Int): IntArray{
var array = intArrayOf()
array += firint
array += secInt
array += thirdInt
return array
}
위의 코드와 같이 인자의 개수만큼 함수를 만들어주어야 합니다. 혹은 그 이상의 인자가 들어왔을 경우에는 에러가 발생합니다.
가변인자를 사용할 경우
가변인자를 사용하는 함수를 만들 경우 정수가 몇개가 들어오든 상관없이 하나의 함수로 처리가 가능합니다.
가변인자를 사용하기 위해선 함수의 인자 앞에 vararg를 선언해주면 됩니다.
앞에 vararg가 선언된 인자는 가변인자로 취급됩니다.. 가변인자는 배열처럼 인식되므로 forEach구문을 통하여 순차 탐색 또한 할 수 있습니다.
fun main(){
makeIntArray(1).forEach{
print("$it ")
} // 1
println()
makeIntArray(1,2).forEach{
print("$it ")
} // 1 2
println()
makeIntArray(1,2,3).forEach{
print("$it ")
} // 1 2 3
println()
}
fun makeIntArray(vararg ints: Int) : IntArray{
var array = intArrayOf()
ints.forEach{
array += it
}
return array
}
이렇게 가변인자를 사용한 함수 하나로 처리를 할 수 있습니다!
인자와 가변인자를 같이 사용하기
가변인자를 사용할 때 가변인자만을 사용해야하는 것은 아닙니다.
단, 일반인자와 같이 사용할 경우 일반적으로는 가변인자를 가장 마지막 인자로 사용합니다.
(그렇지 않으면 컴파일러가 일반인자와 가변인자를 구분하기 힘들기 때문)
일반적으로 인자와 가변인자를 같이 사용하는 경우
fun main() {
makeIntArray("정수의 배열을 만들어 주는 함수", 1, 2, 3, 4).forEach {
print("$it ")
}
// 함수의 이름 : 정수의 배열을 만들어 주는 함수
// 1 2 3 4
}
fun makeIntArray(name: String, vararg ints: Int): IntArray {
println("함수의 이름 : $name")
var array = intArrayOf()
ints.forEach {
array += it
}
return array
}
첫 번째 인자로 함수의 이름을 입력받고 그 뒤에 가변인자로 정수들을 입력 받은 후 함수의 이름을 출력하고 정수의 배열을 반환해주는 함수 입니다.
가변인자를 먼저 사용하고 싶은 경우
무조건 가변인자가 맨 마지막 인자여야만 하는 것은 아닙니다. 하지만 가변인자의 끝을 알려주어야 하기 때문에 일반 인자를 가변인자보다 뒤에 사용한다면 뒤에 나오는 인자의 이름을 명시해주어야 합니다.
fun main() {
makeIntArray(1, 2, 3, 4, name = "정수의 배열을 만들어 주는 함수").forEach {
print("$it ")
}
// 함수의 이름 : 정수의 배열을 만들어 주는 함수
// 1 2 3 4
}
fun makeIntArray(vararg ints: Int, name: String): IntArray {
println("함수의 이름 : $name")
var array = intArrayOf()
ints.forEach {
array += it
}
return array
}
가변인자를 중간에 사용하고 싶은 경우
마찬가지로 가변인자를 중간에 위치한 인자로 사용할 수도 있습니다. 기본적으로 첫 번째 인자는 컴파일러가 일반인자로 인식하기 때문에 가변인자의 뒤에 있는 인자들 이름만 명시해주면 됩니다.
아래의 함수는 첫 번째 인자로 가변인자들의 개수를, 두 번째 인자는 가변인자로 IntArray로 반환될 정수 원소들을, 세 번째 인자는 함수의 이름을, 네 번째 인자는 함수를 만든 이를 받은 후
가변인자들의 개수, 함수의 이름, 만든이를 차례로 출력한 후 가변인자들로 이루어진 정수의 배열을 반환하는 함수입니다.
fun main() {
makeIntArray(4, 1, 2, 3, 4, name = "정수의 배열을 만들어 주는 함수", madeBy="Coco").forEach {
print("$it ")
}
// 인자의 개수 : 4
// 함수의 이름 : 정수의 배열을 만들어 주는 함수
// 만든이 : Coco
// 1 2 3 4
}
fun makeIntArray(argCnt: Int, vararg ints: Int, name: String, madeBy: String ): IntArray {
println("인자의 개수 : $argCnt \n함수의 이름 : $name \n만든이 : $madeBy ")
var array = intArrayOf()
ints.forEach {
array += it
}
return array
}
배열을 가변인자로 넘겨주기
이미 배열이 존재한다면 해당 배열을 가변인자로 사용할 수 있습니다.
물론 배열의 인덱스에 접근하여 배열의 모든 원소들을 하나하나 가변인자로 넣어줄 수 있지만 배열 자체를 통으로 넘겨줄 수 있습니다.
배열 자체를 가변인자로 넘겨주기 위해서는 해당 배열의 이름 앞에 *를 붙여 인자로 넘겨주면 됩니다.
아래의 함수는 IntArray 자체를 가변인자로 받아 해당 배열의 원소들의 합을 반환해주는 함수입니다.
fun main() {
var intArray = intArrayOf(1, 2, 3, 4, 5, 6)
println(sumOfArray(*intArray)) // 21
}
fun sumOfArray(vararg ints: Int): Int {
var sum = 0
ints.forEach {
sum += it
}
return sum
}
최근댓글