오늘도 코틀린 기본 문법과 함께 알고리즘, 자료구조 관련해서 조금 더 찾아보면서 공부해보았다.
여기에는 Kotlin에서 지원하는 가변길이 인자(vararg)에 대해 정리해보았다.
1. 가변길이 인자(vararg)
함수에 전달한 인자의 개수가 가변적이게 만드는 것이 좋을 때가 있다. 인자로 받은 모든 정수들의 합을 구하는 함수를 생각해보자.
fun main(){
val a = sum(1,2,3,4)
println(a) // 10
}
fun sum(a:Int, b:Int, c:Int, d:Int):Int {
return a+b+c+d
}
위와 같이 함수를 작성하면 인자를 딱 4개만 받아서 수들의 합을 구해서 반환할 수 있다.
만약 인자를 2개, 3개, 5개, 6개 받고 싶으면 그에 해당하는 함수를 오버로딩해서 모두 작성해야 할 것이다.
이럴때 가변길이 인자를 사용할 수 있다. vararg라는 키워드를 사용해 가변길이 인자를 선언할 수 있다.
vararg numbers: Int
위와 같이 매개변수를 선언하게 되면 함수가 Int 타입의 값을 0개 이상의 임의의 개수만큼 받는다는 뜻이 된다. (numbers는 매개변수 이름이다.) 함수를 호출하게 되면 인자들을 Int타입의 배열로 묶어 함수로 전달하게 된다. 예시에 쓰인 Int와 같이 원시 타입 배열이 존재하면 원시배열이 사용되고 그렇지 않은 타입이라면 참조배열이 사용되게 된다.
이제 가변길이 인자를 사용해 정수들의 합을 구하는 함수를 다시 작성해보자.
fun main(){
val a = sum()
val b = sum(1,2,3,4,5,6,7,8,9,10)
val c = sum(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)
println(a) // 0
println(b) // 55
println(c) // 253
}
fun sum(vararg numbers: Int):Int {
var sum = 0
for (number in numbers) {
sum += number
}
return sum
}
이제는 Int타입 정수가 0개 이상이기만 하면 몇 개를 인자로 넣든지 간에 상관없이 쉽게 정수들의 합을 구할 수 있게 되었다.
또한 인자를 하나하나 넘기지 않고, 배열을 넘길 수도 있다. 배열 앞에 *를 붙이면 배열의 모든 요소를 가변 길이 인자를 받는 함수에 넘길 수 있다.
그런데 이때 주의해야 할 것은 가변길이 인자의 타입이 원시배열이 존재하는 타입일 경우해는 해당 원시배열을 사용해야한다는 것이다. Int형 가변길이 인자를 사용했을 경우 IntArray만 인자로 넘길 수 있고 Array<Int>는 불가능하다.
코드로 직접 작성해서 확인해보자.
fun main(){
val arr = intArrayOf(10,20,30,40,50)
val arr2 = arrayOf(10,20,30,40,50)
val a = sum(*arr)
// IntArray타입이 아니라 Array<Int>이기 때문에 오류가 발생
// val b = sum(*arr2)
println(a) // 150
}
fun sum(vararg numbers: Int):Int {
var sum = 0
for (number in numbers) {
sum += number
}
return sum
}
하나의 함수에는 vararg로 선언된 매개변수는 하나만 있을 수 있다. 위치는 어디에 넣어도 상관이 없지만 보통은 맨 마지막에 넣는다 그 이유는 코드로 직접 살펴보면 좋다.
fun main(){
val a = sumMultiply(2,5,0,0,0,0,0,0,0,0,0,0)
// 어디까지가 numbers 인지 어느것이 b인지 불명확하다
// val b = sumMultiply2(2,0,0,0,0,0,0,0,0,0,0,0)
val b = sumMultiply2(2,0,0,0,0,0,0,0,0,0,0,0, b=5)
println(a) // 10
println(b) // 10
}
fun sumMultiply(a:Int, b:Int, vararg numbers: Int):Int {
var sum = 0 + a*b
for (number in numbers) {
sum += number
}
return sum
}
fun sumMultiply2(a:Int, vararg numbers: Int, b:Int):Int {
var sum = 0 + a*b
for (number in numbers) {
sum += number
}
return sum
}
위 코드에서 sumMultiply2의 경우는 반드시 b의 이름을 지정해서 인자를 넘겨주어야만 한다. 왜냐하면 가변길이 인자가 어디까지인지 불명확하기 때문이다. 사용은 가능하지만 위와 같은 이유 때문에 보통은 맨 마지막에만 넣어 사용한다.
여기까지 가변길이 인자에 대해 정리해보았다.
2. 오늘 배운 것
- 가변길이 인자에 대해 공부해보았다.
- 빅오와 시간복잡도에 대해 조금이나마 공부해보았다.
'오늘 배운 것' 카테고리의 다른 글
24-04-30 Kotlin 숫자 야구 게임 만들기 (2) (0) | 2024.04.30 |
---|---|
24-04-29 Kotlin 숫자 야구 게임 만들기 (0) | 2024.04.29 |
24-04-27 Kotlin 기본 매개변수(Default Parameter) (0) | 2024.04.27 |
24-04-26 Kotlin 인터페이스와 추상 클래스 (0) | 2024.04.26 |
24-04-25 Kotlin 계산기 만들기 (2) (0) | 2024.04.25 |