HIT해

[Swift 기초문법 - 16] 메소드 매개변수 inout 본문

Swift/Swift 기초문법

[Swift 기초문법 - 16] 메소드 매개변수 inout

힛해 2024. 7. 12. 00:55
728x90

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 키워드를 사용하면 함수 내부에서 매개변수의 값을 변경하고, 그 변경 사항을 호출자에게 반영할 수 있다. 이를 통해 함수의 유연성을 높이고, 특정 상황에서 더 효율적인 코드를 작성할 수 있다.