[Swift 기초문법 - 16] 메소드 매개변수 inout
Swift에서 inout 키워드는 함수의 매개변수에 사용되어 함수 내부에서 매개변수의 값을 변경할 수 있게 해준다. 기본적으로 Swift의 함수 매개변수는 값 타입으로 전달되기 때문에 함수 내부에서 매개변수의 값을 변경해도 함수 호출자에게는 반영되지 않는다. inout 키워드를 사용하면 이 제한을 극복할 수 있다.
inout 키워드 사용 예제
다음은 inout 키워드를 사용하는 간단한 예제이다.
func swapValues(_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
var x = 10
var y = 20
swapValues(&x, &y)
print("x: \\(x), y: \\(y)")// x: 20, y: 10
위 예제에서 swapValues 함수는 두 개의 inout 매개변수를 받는다.
함수 호출 시 매개변수 앞에 & 기호를 사용하여 값을 전달한다.
함수 내부에서 매개변수의 값을 교환한 후, 호출자에게도 그 변경사항이 반영된다.
inout 키워드의 특징
복사 후 수정(Copy-In, Copy-Out): inout 매개변수는 함수가 시작할 때 복사되고, 함수가 종료될 때 다시 복사되어 호출자에게 반영된다.참조 전달: inout 매개변수는 참조 방식으로 전달되므로 함수 내부에서 매개변수의 값을 변경하면 그 변경 사항이 호출자에게 반영된다.안전성: Swift는 inout 매개변수를 사용할 때 메모리 안전성을 보장하기 위해 여러 가지 안전 장치를 마련해 두었다. 예를 들어, 동일한 변수에 대해 중복된 inout 참조를 허용하지 않는다.
일반 매개변수와의 차이점
기본적으로 함수 매개변수는 값 타입으로 전달되므로 함수 내부에서 매개변수의 값을 변경해도 함수 호출자에게는 영향을 미치지 않는다. inout 키워드는 이와 달리 참조 타입으로 전달되어 함수 내부에서 매개변수의 값을 변경할 수 있게 해준다.
func increment(value: Int) {
// value = 20 // 이런식으로 하면 오류가 발생한다
var value = value
value += 1
print("함수 내부 값: \\(value)")
}
var number = 10
increment(value: number)
print("함수 호출 후 값: \\(number)")// 함수 호출 후 값: 10
위 예제에서 increment 함수는 매개변수를 값 타입으로 전달받기 때문에 함수 내부에서 값을 변경해도 호출자에게는 반영되지 않는다.
inout 키워드 사용 시 주의사항
inout 매개변수는 상수로 전달할 수 없다: inout 매개변수는 변수로만 전달할 수 있다.
& 기호 사용: 함수 호출 시 inout 매개변수 앞에 & 기호를 붙여야 한다.
메모리 안전성: inout 매개변수는 함수 호출 중에 다른 참조에 의해 변경되지 않도록 주의해야 한다.
결론
Swift의 inout 키워드를 사용하면 함수 내부에서 매개변수의 값을 변경하고, 그 변경 사항을 호출자에게 반영할 수 있다. 이를 통해 함수의 유연성을 높이고, 특정 상황에서 더 효율적인 코드를 작성할 수 있다.