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 되는 과정은, 주솟값이 복사되는 걸로 (일단)