iOS 개발/SwiftUI
[SwiftUI] inout은 어떻게 작동하는가 (C언어의 Call by Reference와 비교)
스닥
2022. 3. 21. 18:38
Generics 함수를 공부하던 중, inout이 어떻게 작동하는지 궁금해져서 한번 주솟값들을 찍어봤습니다.
swift에서 inout은 C언어의 Call by Reference와 똑같이 작동할까요?
먼저 C언어에서 Call by Reference를 살펴볼게요
#include <stdio.h>
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(void)
{
int a = 42;
int b = 21;
swap(&a, &b);
}
C에서는 pointer를 사용하여, 주솟값을 함수로 넘겨줍니다.
그리고 이 주솟값 안의 변수를 복사하고 수정하는 등의 작업을 손쉽게 처리할 수 있습니다.
이렇게 실제로 주솟값을 보내서 해당 주솟값이 가리키는 변수만 수정한다는 것을 알 수 있었습니다.
Before Call Swap Function
a: 42(address: 0x16f7c362c)
b: 21(address: 0x16f7c3628)
----------------------------
In Function
Before Swap
a: 42(address: 0x16f7c362c)
b: 21(address: 0x16f7c3628)
After Swap
a: 21(address: 0x16f7c362c)
b: 42(address: 0x16f7c3628)
----------------------------
After Call Function
a: 21(address: 0x16f7c362c)
b: 42(address: 0x16f7c3628)
그럼 Swift의 inout 키워드에서는 어떨까요?
import Foundation
func address(of object: UnsafeRawPointer) -> String{
let address = Int(bitPattern: object)
return String(format: "%p", address)
}
func swapTwoValues<T>(a: inout T, b: inout T) {
var temp = a
print("In Function")
print("------------")
print("a:", address(of: &a))
print("b:", address(of: &b))
a = b
b = temp
print("a:", address(of: &a))
print("b:", address(of: &b))
print("------------")
}
var a = "abc"
var b = "cde"
print("Before call function")
print("------------")
print("a: ", address(of: &a))
print("b: ", address(of: &b))
print("------------")
swapTwoValues(a: &a, b: &b)
print("After call function")
print("------------")
print("a: ", address(of: &a))
print("b: ", address(of: &b))
print("------------")
마찬가지로 해당 변수의 주솟값은 그대로 있고 주솟값이 가리키는 변수를 수정하는 작업과 정확히 같은 작업이 일어납니다.
Before call function
------------
a: 0x100008008
b: 0x100008018
------------
In Function
------------
a: 0x100008008
b: 0x100008018
a: 0x100008008
b: 0x100008018
------------
After call function
------------
a: 0x100008008
b: 0x100008018
------------
copy-in copy-out 되는 과정은, 주솟값이 복사되는 걸로 (일단)