728x90
반응형
가변 매개변수(variadic parameter)
Swift에서 가변 매개변수(variadic parameter)는 함수에 동적인 개수의 인자를 전달하기 위해 사용되는 특별한 매개변수입니다. 가변 매개변수를 사용하면 함수를 호출할 때 인자의 개수를 유연하게 조정할 수 있습니다.
가변 매개변수의 특징에 대해서 알아보도록 하겠습니다.
- 문법 : 가변 매개변수는 타입 뒤에 세 개의 점(...)을 사용하여 정의됩니다. 예를 들어, func sum(numbers: Int...)과 같이 선언할 수 있습니다.
- 타입 : 가변 매개변수는 배열로 처리됩니다. 따라서 함수 내부에서 해당 매개변수에 접근할 때 배열 형태로 다루어야 합니다.
- 호출 시 인자 전달 : 가변 매개변수를 사용하는 함수를 호출할 때, 여러 개의 인자 값을 콤마(,)로 구분하여 전달합니다.
- 인자 개수 제한 : 가변 매개변수는 하나만 선언할 수 있으며, 일반적인 (가능한 한 명시적인) 매개 변수와 함께 사용될 수 있습니다.
2가지의 소스 코드와 함께 보도록 하겠습니다.
func sum(numbers: Int...) -> Int {
var total = 0
for number in numbers {
total += number
}
return total
}
let result = sum(numbers: 1, 2, 3, 4)
print(result) // 출력: 10
func printNames(prefix: String, names: String...) {
for name in names {
print("\(prefix) \(name)")
}
}
printNames(prefix: "Hello", names: "Alice", "Bob", "Charlie")
// 출력:
// Hello Alice
// Hello Bob
// Hello Charlie
inout 매개변수 : call by address 구현
Swift에서 inout 매개변수는 함수 내에서 전달된 변수의 값을 수정하고, 이를 호출한 곳으로 변경된 값을 다시 전달하는 데 사용됩니다. 이를 통해 "참조에 의한 호출" 또는 "call by address" 방식을 구현할 수 있습니다.
함수가 값을 반환한 후에도 매개변수에 일어난 변화를 유지하려면, 함수의 선언부에서매개변수를 입출력 매개변수(in-out parameter)로 선언해야 합니다.
소스 코드를 보겠습니다.
func swapValues(a: inout Int, b: inout Int) {
let temp = a
a = b
b = temp
}
var x = 10
var y = 20
swapValues(a: &x, b: &y)
print("x =", x) // 출력: x = 20
print("y =", y) // 출력: y = 10
위 코드에서 swapValues 함수는 두 개의 정수 값을 받아서 서로의 값을 교환합니다. 이때 x, y와 같은 가변 변수들을 인자로 넘기기 위해 앰퍼샌드(&) 기호가 사용됩니다.
함수 내부에서 값이 교환되면 원래의 변수(x, y)도 영향을 받아 결과적으로 출력 결과가 변경됩니다.
주의사항
- 일반적으로 Swift에서는 참조 타입(클래스 등)을 사용하여 참조에 의한 호출(call by reference)을 구현하므로 대부분 상황에서 직접적인 필요성은 없습니다.
- 잘못된 사용으로 인해 충돌이나 부작용이 발생하지 않도록 주의해야 합니다.
- 가능하다면 다른 방법(반환값 등)을 고려하여 코드를 작성하는 것이 좋습니다.
감사합니다.
틀린 부분이 있거나 더 좋은 내용 훈수 환영합니다!
공감과 댓글 부탁드립니다.
728x90
반응형
'Apple > Swift' 카테고리의 다른 글
[Swift] 클로저(Closure) (0) | 2023.10.16 |
---|---|
[Swift] 1급 객체 (first class object), 1급 시민 (first class citizen) (0) | 2023.10.13 |
[Swift] guard~let, 디폴트 매개변수 정의, 함수 응용 (0) | 2023.10.11 |
[Swift] Raw Values (원시 값) (0) | 2023.10.10 |
[Swift] 델리게이트 패턴(Delegate Pattern) (2) | 2023.10.08 |