-
Swift - Function Variadic, In-out ParameterProgramming/Swift 2020. 10. 8. 23:33
안녕하세요 :)
오늘은 Parameter의 Defalut Value 그리고 Variadic Parameter와 In-out Parameter에 대해서 공부해보도록 하겠습니다!
Default Value
Parameter를 작성할 때 Default Value(기본값)을 지정할 수 있습니다.
기본값을 지정하게 되면 함수를 호출할 때 Argument Label을 생략할 수 있으며 생략하면 기본값으로 Parameter에 전달됩니다.
Type뒤에 = defaultValue를 적어주면 됩니다. 당연히 기본값은 앞에 Type과 같은 Type 이어야 합니다.
그럼 어떻게 사용되는지 예를 보겠습니다.
Parameter 선언 부분에 argumentLable을 to로 parameter는 String Type의 name으로 선언했습니다.
그리고 기본값을 "Link"로 지정했습니다.
이제 함수 호출문을 봐주세요!
원래 함수를 호출할때 argumentLabel인 to를 전달해야 하는데 아무것도 적지 않았습니다.
이러면 name에 기본값인 "Link"가 알아서 전달됩니다. 그래서 Open your eyes... Wake up, Link가 출력되는 것을 확인할 수 있습니다.
그다음은 to: "BeePeach"를 전달했습니다. 그러면 기본값은 무시되고 name에 "BeePeach"가 전달됩니다.
Variadic Parameter
Variadic Parameter(가변 파라미터)는 한 개 이상의 Argument를 전달 가능한 Parameter입니다.
기존 함수 선언문과 다른 점이 보이시나요??
Type 뒤에 ...이 추가됐습니다. 이렇게 선언하면 name은 가변 파라미터가 됩니다.
가변 파라미터에 전달된 한 개 이상의 Argument는 배열로 전달됩니다. (배열에 대해서는 Collect 파트에서 따로 포스팅하겠습니다!)
그래서 파라미터를 FunctionBody안에 작성된 for-in 반복문에서 사용이 가능합니다.
addNumbers(num:) 함수는 num이라는 Int Type의 가변 파라미터를 받아 Int를 리턴하는 함수입니다.
Function Body를 살펴볼게요!
num 파라미터는 Argument를 배열로 받았으니 for-in 반복문에서 사용할 수 있습니다.
반복문에서 result변수에 배열의 요소를 차례대로 전달하며 더하고 있습니다.
다시 말해 Argument로 받은 수들을 모두 더하는 함수입니다.
이전에 만들었던 add(a:b:) 함수는 더할 수 있는 수의 개수가 2개로 정해져 있는 함수였지만 addNumbers(num:) 함수는 이러한 제한이 없습니다.
여기서 헷갈리지 않게 조심해야 하는 부분이 있습니다.
addNumbers(num: 1, 2) 에서 Argument와 Parameter는 각각 몇 개일까요??
Argument는 2개 Parameter는 1개입니다.
addNumbers(num: 10, 20, 100, 2, 5, 7)에서도 Argument는 6개 Parameter는 1개입니다.
Parameter는 가변 파라미터 1개뿐입니다. 파라미터가 여러 개라고 착각하시면 안 됩니다!
Variadic Parameter 주의사항
가변 파라미터는 기본값을 사용할 수 없습니다.
또한 가변 파라미터는 함수에 1개씩만 사용할 수 있습니다.
In-out Parameter
Function Body에 사용하는 Parameter는 임시 상수라고 말씀드렸습니다.
그래서 Body에서 파라미터를 바꾸려고 하면 에러가 발생합니다. 그럼 이때는 어떻게 해야 할까요??
이때 사용하는 Parameter가 바로 In-out Parameter(입출력 파라미터)입니다.
parameterType 앞에 inout Keyword를 사용합니다.
일단 입출력 파라미터를 사용하지 않고 두 변수의 값을 교환하는 함수를 선언해 보겠습니다.
상수 temp에 a를 저장하는 건 괜찮습니다.
하지만 a = b, a에 b를 저장하려 할 때 에러가 발생합니다.
파라미터인 a와 b는 상수이기 때문이죠!
이제 입출력 파라미터를 이용해서 함수를 선언해 보겠습니다.
swapNum함수가 에러 없이 실행이 되었습니다.
여기서 주목할 점은 함수 호출 부분입니다.
입출력 파라미터를 가진 함수는 일반적인 함수 호출법과 다르게 호출합니다.
funcName(argumentLabel: &Expression)
차이점은 argumentLabel다음에 &이 오고 Expression이 온다는 점입니다.
입출력 파라미터를 사용한 함수를 호출할 때는 반드시 &을 작성해 줘야 합니다.
In-out Parameter 주의사항
입출력 파라미터를 사용한 함수를 호출할 때는 argument에 상수를 사용할 수 없습니다.
이유는 입출력 파라미터의 동작 방식은 Copy-in Copy-out을 사용하기 때문입니다.
값을 복사해 functionBody에 전달하고 함수가 종료될 때 마지막 값을 복사해서 argument로 전달했던 expression으로 전달해줍니다.
그렇기 때문에 상수가 argument로 전달되면 복사된 값을 전달받을 수 없기 때문에 에러가 발생합니다.
그리고 호출문에서 &뒤에는 Expression이 와야 합니다.
예를 들어 일반적인 함수 호출에 사용한 Literal은 사용할 수 없습니다.
Literal은 메모리가 없으니 값을 저장할 수도 없겠죠? 그래서 에러가 발생합니다.
살펴본 바와 같이 입출력 파라미터를 호출할 때는 제약이 많습니다.
입출력 파라미터를 호출할 때는 실수하지 않도록 주의해야 합니다.
입출력 파라미터를 선언할 때에도 가변 파라미터와 마찬가지로 기본값을 줄 수 없습니다.
그리고 가변 파라미터를 사용할 수도 없습니다.
참고자료
https://docs.swift.org/swift-book/LanguageGuide/Functions.html
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Closure (1) 2020.10.11 Swift - Function Notation, Function Type (0) 2020.10.09 Swift - Function Parameter (0) 2020.10.07 Swift - Function Basic (0) 2020.10.06 Swift - Optional Binding, Nil-coalescing Operator (0) 2020.10.05