-
[Swift] Function - 2 (Variadic Parameter, In-Out Parameter)Swift 2022. 2. 15. 02:39
(๋ชจ๋ ์ฝ๋๋ Playground์์ ์์ฑ๋์์ต๋๋ค.)
์ ๋ฒ ์๊ฐ์ ์ด์ด ์ด๋ฒ์๋ Variadic Parameter (๊ฐ๋ณ ํ๋ผ๋ฏธํฐ)์ In-Out Parameter (์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ)์ ๋ํด์ ์์๋ณด๊ณ ์ ํ๋ค.
1. Variadic Parameter (๊ฐ๋ณ ํ๋ผ๋ฏธํฐ)
์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง ํ๋ผ๋ฏธํฐ ํ๋์ ์ธ์ ํ๋๋ฅผ ์ ๋ฌํ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ํ๋ผ๋ฏธํฐ ํ๋๋ก ์ฌ๋ฌ ์ธ์๋ฅผ ์ ๋ฌํ ์๋ ์์๊น?
๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค.
๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ ์ด๋ฆ์ฒ๋ผ ์ ๋ฌํ ์ ์๋ ์ธ์๊ฐ ๊ณ ์ ๋์ด์์ง ์๊ณ ๊ฐ๋ณ์ ์ด๋ฉฐ, ํ๋์ ํ๋ผ๋ฏธํฐ๋ก 2๊ฐ ์ด์์ ์ธ์ (argument) ๋ฅผ ์ ๋ฌํ ์ ์๋ค. ์ด ๋, ์ธ์๋ ๋ฐฐ์ด ํํ๋ก ํจ์ ๋ด์ ์ ๋ฌ๋๋ค.
๋ฌธ๋ฒ์ ์๋์ ๊ฐ๋ค.
func variadicFunc(_ param: Type...) { // Code }ํ์ฌ Argument Label์ ์์ผ๋์นด๋ ํจํด์ผ๋ก ์๋ตํ๊ณ , ํ๋ผ๋ฏธํฐ param์ Type... ๋ก ๋์ด์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ ํ์ ๋ค์ ...์ ๊ณต๋ฐฑ ์์ด ๋ถ์ด๋ฉด ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๊ฐ ๋๋ค.
์๋ ์์๋ฅผ ๋ณด์.

์ด ํจ์๋ ํ๋ผ๋ฏธํฐ๋ก ์ฌ๋ฌ ๊ฐ์ ์ซ์๋ฅผ ์ธ์๋ก ์ ๋ฌํด์ ๊ทธ ์ซ์๋ค์ ์ดํฉ์ ์ถ๋ ฅํ๋ ํจ์์ด๋ค.
nums๊ฐ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ์ด๊ณ , ์ฌ๋ฌ ๊ฐ์ ์ซ์๋ค์ ์ธ์๋ก ์ ๋ฌํ๋ฉด ๊ทธ ์ซ์๋ค์ด ๋ฐฐ์ด๋ก ํจ์ ๋ด๋ก ์ ๋ฌ๋๋ค.
๋ฐ๋ผ์ 1, 2, 3์ ์ ๋ฌํ์ ๋์๋ 6์ด, 1, 2, 3, 4, 5๋ฅผ ์ ๋ฌํ์ ๋์๋ 15๊ฐ, 100, 200, 300์ ์ ๋ฌํ์ ๋์๋ 600์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ ๊น? ๊ฐ๋ฅํ๋ค!
์ฌ์ค ์ด์ ์๋ ํจ์ ๋ด์์ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ฅผ 1๊ฐ๋ง ์ธ ์ ์์๋ค. ๊ทธ๋ฐ๋ฐ Swift 5.4์ Xcode 12.5๋ก ๋์ด์ค๋ฉด์, ํจ์ ๋ด์์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ฅผ ์ธ ์ ์๊ฒ ๋์๋ค.
์๋ ์์๋ฅผ ๋ณด์.

์ด ํจ์๋ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ nums, doubleNums, seasons๋ฅผ ๊ฐ๋๋ค.
์ง๊ธ์ ํ๋ผ๋ฏธํฐ๊ฐ ๊ณง Argument Label์ด๋ค. ๋ฐ๋ผ์ ํจ์๋ฅผ ํธ์ถํ ๋์๋ Argument Label์ ์จ์ฃผ์ด์ผํ๋ค.
๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.

๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๊ฐ ๋ง์ ๋์๋ ๋ฐ๋ก ์์ ์์์ ๊ฐ์ด Argument Label์ ๋ฐ๋์ ์จ์ผํ๋ค.
Argument Label์ ์ฐ์ง ์์ผ๋ฉด, ์ธ์๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ๋ฌํ ๋ ์ปดํ์ผ๋ฌ๋ ํด๋นํ๋ ์ธ์๊ฐ ์ด๋ค ํ๋ผ๋ฏธํฐ์ ํด๋นํ๋ ์ธ์์ธ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ์ ์์๋ 2๊ฐ์ Argument Label์ ์๋ตํ ๊ฒ์ด๋ค.

์ด๋ ๊ฒ Argument Label์ ์๋ตํ๋ฉด, ์ด๋ค ํ๋ผ๋ฏธํฐ์ ํด๋นํ๋ ์ธ์์ธ์ง ๋ช ํํ ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ ๋์๋ Argument Label์ ์๋ตํ์ง ์๋๋ก ํ์.
ํ์ง๋ง Argument Label์ ์๋ตํ ์ ์๋ ๊ฒฝ์ฐ๋ ์๋ค.
์๋ ์์์ฒ๋ผ ์ ์ผ ์์ Argument Label๋ง ์๋ตํ๊ณ ๊ทธ ๋ค์ ๋ชจ๋ Argument Label์ ๋ช ์ํด์ฃผ๋ฉด, ์ปดํ์ผ๋ฌ๋ ์ด๋๋ถํฐ ์ด๋๊น์ง๊ฐ ์ด๋ค ํ๋ผ๋ฏธํฐ์ ์ธ์์ธ์ง ์ ์ ์๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ณผ๋ ์ ๋๋ก ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

์ถ๊ฐ๋ก, ์ผ๋ฐ ํ๋ผ๋ฏธํฐ์ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ฅ ๋ค์ ์จ์ผํ๋ค. ์๋ ์์๋ฅผ ๋ณด์.

์ด ํจ์๋ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ง ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ์ด๋ค. ๋ฐ๋ผ์ ํจ์๋ฅผ ํธ์ถํ ๋, ์๋์ผ๋ก 1์ nums์ ์ธ์๋ก ์ ๋ฌ๋๊ณ , ๋๋จธ์ง ์ธ์๋ค์ doubleNums๋ก ์ ๋ฌ์ด ๋๋ค.
ํ์ง๋ง ์๋ ์์๋ ๋ค๋ฅด๋ค.

์ ํจ์์ ํ๋ผ๋ฏธํฐ ์์๋ฅผ ๋ฐ๊พผ ๊ฒ์ธ๋ฐ, ์์ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๊ฐ ์จ๋ค.
์ด ๋ ์ปดํ์ผ๋ฌ๋ ์์ ๋งํ ๊ฒ์ฒ๋ผ ์ด๋ค ์ธ์๊น์ง๊ฐ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ์ธ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ์ ์ผ๋ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ด ์ธ ๋, ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ค์ ์จ์ฃผ๋๋ก ํ์.
๊ทธ๋ฆฌ๊ณ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ ๊ธฐ๋ณธ ๊ฐ์ ์ ์ธํ ์ ์๋ค๋ ์ ์ ์์๋๋๋ก ํ์.

2. In-Out Parameter (์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ)
ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ๊ฐ์ ํจ์ ๋ด์์ ์ฌ์ฉํ ์ ์๋ ์์ ์์์ด๋ฏ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก ์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ์ด๋ค.
์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ๋ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ๊ฐ์ ํจ์ ๋ด๋ถ์์ ์ง์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ค๋ค.
๋ฌธ๋ฒ์ ์๋์ ๊ฐ์ด ํ์ ์์ Inout ํค์๋๋ฅผ ์จ์ฃผ๋ฉด ๋๋ค.
func inOutFunc(_ a: inout Int, _ b: inout Int) { // Code }์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ํจ์๋ฅผ ํธ์ถํ ๋์๋ ์ธ์ ์์ &๋ฅผ ๋ฐ๋์ ๋ถ์ฌ์ฃผ์ด์ผํ๋ค.
์์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์๋์ ๊ฐ๋ค.
var num1 = 1 var num2 = 2 inOutFunc(&num1, &num2)์๋ ํจ์์ ํ๋ผ๋ฏธํฐ๋ ์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.

์ด๋ฒ์๋ inout ํค์๋๋ฅผ ์ด์ฉํ์ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ๋ก ์ ์ธํ์๋ค.

์ค๋ฅ ์์ด ์ ์คํ์ด ๋๊ณ , ์คํ ๊ฒฐ๊ณผ num1๊ณผ num2๊ฐ ์๋ก ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ๋ Copy-In, Copy-Out ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค.
inOutFunc์์ ์ธ์๋ฅผ ์ ๋ฌํ๊ณ ์๋๋ฐ, num1๊ณผ num2์ ์ ์ฅ๋ ๊ฐ์ ๋ณต์ฌํด์ ์ ๋ฌํ๋ค. ์ด๋ฅผ Copy-In์ด๋ผ๊ณ ํ๋ค.
ํจ์๊ฐ ๋ชจ๋ ์คํ๋๊ณ ์ข ๋ฃ๋๋ฉด, ํจ์ ๋ด์์ ๋ณ๊ฒฝํ ๊ฐ์ด ์ธ์๋ก ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค. ์ด๋ฅผ Copy-Out์ด๋ผ๊ณ ํ๋ค.
์ฆ, num1์ ์ ์ฅ๋ ๊ฐ์ด ๋ณต์ฌ๋์ด a๋ก ์ ๋ฌ๋๊ณ (Copy-In), ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด ๋ณ๊ฒฝ๋ a์ ๊ฐ์ ๋ค์ ๋ณต์ฌ๋์ด num1์ผ๋ก ๋ณต์ฌ (Copy-Out) ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ํจ์ ๋ด์์ ์์ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ด๋ค.
์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ์ ์ ์ฝ์ ๋ํด์ ์์๋ณด์.
์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ์๋ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ๋ ๊ธฐ๋ณธ ๊ฐ์ ์ ์ธํ ์ ์๋ค.

๊ธฐ๋ณธ ๊ฐ ์ ์ธ ๋ถ๊ฐ 
๊ฐ๋ณ ํ๋ผ๋ฏธํฐ ์ ์ธ ๋ถ๊ฐ ์ ์ถ๋ ฅ ํ๋ผ๋ฏธํฐ์๋ ์์๋ ๋ฆฌํฐ๋ด์ ์ ๋ฌํ ์ ์๋ค.
๋ง์ง๋ง์ ํจ์ ์คํ์ด ์ข ๋ฃ๋๊ณ ๊ฐ์ ๋ณต์ฌํด์ ์ ๋ฌํด์ผํ๋๋ฐ, ์์๋ ๊ฐ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์์ ๋งํ Copy-Out์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌํฐ๋ด๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ๋ฆฌํฐ๋ด์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋ ๊ฐ์ด ์๋๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ณ๊ฒฝ๋ ๋ถ๊ฐ๋ฅํ๊ณ , Copy-Out์ ํ ์ ์๋ค.

์์ ์ ๋ฌ ๋ถ๊ฐ 
๋ฆฌํฐ๋ด ์ ๋ฌ ๋ถ๊ฐ ์ฌ๊ธฐ์ immutable์ด๋, ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฒ์ธ๋ฐ ์ด์ ๋ฐ๋๋ก mutable์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๋ป์ด๋ค. ์์ผ๋ก ์์ฃผ ๋ณด๊ฒ ๋ ๋จ์ด๋ ๊ผญ ๊ธฐ์ตํด๋๋๋ก ํ์.

'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Closure, Syntax Optimization (0) 2022.02.15 [Swift] Function - 3 (Implicit Return, Function Notation, Function Types) (0) 2022.02.15 [Swift] Function - 1 (Defining/Calling Function, Parameter, Argument Label) (0) 2022.02.15 [Swift] Optional - 2 (IUO, Nil-Coalescing, Optional Chaining) (0) 2022.02.14 [Swift] Optional - 1 (Forced Unwrapping, Optional Binding) (0) 2022.02.14