메이쁘

[Kotlin] vararg parameter를 가진 함수에 Int 타입의 Array를 넣을 경우! (Array<String>은 되는데, Array<Int>는 왜 안되지?) 본문

Language/Kotlin

[Kotlin] vararg parameter를 가진 함수에 Int 타입의 Array를 넣을 경우! (Array<String>은 되는데, Array<Int>는 왜 안되지?)

메이쁘 2022. 3. 22. 12:01

안녕하세요.

 

fun sum(vararg nums: Int) = nums.sum()  // parameter로 받은 숫자들을 전부 더하는 함수

와 같이, 간단한 함수를 가지고 테스트를 해봤습니다.

 

vararg nums를 parameter로 받는 함수인데요.

 

 

vararg는 가변인자. 즉, 매개변수의 개수를 동적으로 지정해 줄 수 있게 하는 변수 입니다.

그렇기 때문에, 배열을 parameter로 넘길 수 있습니다.

 

 

근데 왜 이 글을 포스팅하게 되었냐!!

 

 

String 같은 경우, arrayOf() 함수를 사용해서 Array<String> 으로 형변환한 뒤 

fun showAll(vararg s: String) { // parameter로 받은 문자열을 전부 보여주는 함수
    println(s.joinToString())
}

와 같은 함수의 parameter로 넣는 경우, 

 

showAll(test) // // error(Type mismatch!)
showAll(*test) // *(spread operator) 를 앞에 붙이면 가능해짐

*(spread operator)를 앞에 붙이면 오류가 발생하지 않고 동작합니다.

 

실제 코드 화면.

 

 

하지만, 

Int같은 경우에는??

 

와 같은 오류를 뱉어냅니다..

 

읭? String이랑 Int랑 무슨 차이가 있다고..??

 

 


1. 원인 및 해결

 

오호.. stackoverflow 스승님의 말에 따르면,

arrayOf() 함수를 사용하면 Array<Int> 가 아니라, Array<Integer>로 변환되기 때문에, Int와 Integer는 엄연히 다르므로, 컴파일되지않고 오류라고 판단한다는 겁니다.

 

그렇기 때문에, Integer -> Int 로 형변환 해야하는데요.

 

 

형변환 하는 방법은 두 가지가 있습니다.

 

  1) intArrayOf() 함수를 사용

  2) arrayOf() 함수 사용 후 toIntArray() 함수로 Array<Integer> -> Array<Int>로 형변환

 

 

그 결과로 위 캡쳐화면 보시면

이제 둘 다 오류가 발생하지 않습니다..!!!!

 

 

하나 배워갑니다..!!!

 

합합합

 

감사합니다.

 

 

 

참고: https://stackoverflow.com/questions/48855791/how-does-one-pass-an-arrayint-to-a-vararg-int-function-using-the-spread-operat

Comments