아리의 iOS 탐구생활

[Swift] Function inout parameter? 본문

Swift/문법

[Swift] Function inout parameter?

Ari Lee 2021. 8. 12. 22:21
반응형

✔️ inout이 뭔데?

Swift는 기본적으로 'call by value' 형식이다.

그래서 call by reference를 구현하려면 함수의 매개변수를 inout parameter로 구현해야한다.

 

 

 

함수의 매개변수는 기본적으로 상수(let)이다.

함수는 값을 복사하여 내부에 전달하지만, inout 키워드를 사용하면 참조로 전달하게 된다.

예를 들어 일반적인 함수를 만들어서 확인해보면,

 

var A = 3
var B = 9
func swapTwoTest(_ numbersOwn: Int, _ numbersTwo: Int) {
    // numbersOwn = 6 // Cannot assign to value: 'numbersOwn' is a 'let' constant
    // numbersTwo = 18 // Cannot assign to value: 'numbersTwo' is a 'let' constant
    var C = numbersOwn
    var D = numbersTwo
    C = 6
    D = 18
    print(C, D) // 6 18
}
swapTwoTest(A, B)
print(A, B) // 3 9

 

위 주석과 같이 매개변수가 상수라서 전달받은 값을 변경하려고 하면 값을 할당할 수 없다고 나온다.

또한 다른 방법으로 값을 변수로 복사하여 변경하여도 원본에는 영향을 끼치지 않는다.

함수 호출이 끝난 후에도 값이 변경되지 않고 그대로인 것을 확인할 수 있다.

 

왜냐하면 값을 복사하여 함수에 넘겨주기 때문이다.

 

 

 

 

하지만 inout 키워드를 사용하게 된다면?

var A = 3
var B = 9
func swapTwoNumbers(_ numberOwn: inout Int,_ numberTwo: inout Int) {
    let tmp = numberOwn
    numberOwn = numberTwo
    numberTwo = tmp
}
print(A, B) // 3 9
swapTwoNumbers(&A, &B)
print(A, B) // 9 3

 

매개변수가 더이상 원본을 복사한 값이 아니라 원본 변수 A의 참조를 전달한다.

그래서 함수 내부에서 원본을 수정할 수 있는 것이다.

함수가 호출이 끝나도 함수 내부에서 변경한 값이 그대로인 것을 확인할 수 있다.

 

이것을 ‘call by reference’ 라고 한다.

 

 

 

✔️ Apple 공식 문서

 

Functions — The Swift Programming Language (Swift 5.5)

Functions Functions are self-contained chunks of code that perform a specific task. You give a function a name that identifies what it does, and this name is used to “call” the function to perform its task when needed. Swift’s unified function syntax

docs.swift.org

 

반응형
Comments