[오늘의 Swift 지식] In-Out이란 무엇일까?
📌 Swift

[오늘의 Swift 지식] In-Out이란 무엇일까?

In-Out은 왜 사용하는 것일까?

C, C++, Python, Java 등의 언어에서 함수의 파라미터는 "변수"로 사용됩니다. 그렇다면, Swift에서도 함수의 파라미터는 변수일까요?

 

답은 그렇지 않습니다. Swift에서 함수의 파라미터는 let 상수(Constant)로 사용되며, 당연하게도 상수인 인자 값을 변경하려고 시도하면 컴파일 에러가 발생합니다.

 

그렇다면, 메서드 내에서 인자값을 변경하고 원본 변수에도 영향을 주어서 그 변수에서 벗어나더라도 값이 유지가 되게 하려면 어떻게 해야 할까요? 🤔

 

위의 질문과 같이 인자값을 변경해주기 위해서는 함수 안에서 지역변수의 선언을 통해 값을 대입해주는 과정이 필요합니다. 하지만, 그 값은 함수를 벗어나면 사라지기 때문에 그 값을 유지시켜주기 위하여 in-out 매개변수를 사용해주는 겁니다.

 

 

인-아웃 매개변수(In-Out Parameter)

in-out 매개변수는 메서드 인자 앞에 inout 키워드를 붙여서 in-out parameter를 사용할 수 있습니다.

 

그리고 in-out 매개변수로 전달할 경우에, 전달한 변수 앞에는 '&' 문자를 표시해주어야합니다. 그 이유는 "해당 변수가 in-out 매개변수로서 사용될 것이다."라는 것을 알려주기 위해서 표시해주는 것입니다.

 

Swift 언어 가이드에 있는 예시입니다. (링크는 아래 있습니다.)

func swapTwoInts(_ a: inout Int, _ b: inout Int) { // a = 2, b = 16
    let temporaryA = a // temporaryA = 2
    a = b // a = b(16)
    b = temporaryA // b = a(2)
}

var firstInt = 2
var secondInt = 16
swapTwoInts(&firstInt, &secondInt)
print("firstInt is \(firstInt) and secondInt is \(secondInt)")

// "firstInt is 16 and secondInt is 2"

위 코드를 간단히 설명해보자면, in-out의 인자 값으로 사용할 "firstInt"와 "secondInt" 두 개의 변수를 선언해주었으며, 이 값들은 변수의 이름 앞에 '&'를 붙여주고 swapTwoInts 메서드 a, b의 in-out 매개변수로 사용하였습니다.

 

swapTwoInts함수 안에서 firstInt의 값과 secondInt의 값을 스왑해주었으며, 위에서 설명한 대로 함수를 벗어나도 값을 유지시켜주기 위해서 in-out 매개변수를 사용했기 때문에, 스왑 된 값은 종료된 후에 원본 값에도 적용되며, 함수를 벗어나도 값이 변경된 상태로 유지되는 것을 볼 수 있습니다.

 

in-out의 동작 원리

in-out 매개변수는 copy-in copy-out이라는 동작 방식으로 전달되는데요. copy-in copy-out 동작 방식은 아래와 같습니다.

1. 함수가 호출되면, 매개변수로 넘겨진 변수가 복사됩니다.
2. 함수 몸체에서 복사한 값을 변화시킵니다. (예시 코드에서 a와 b로 값을 스왑 해주는 부분)
3. 함수가 반환되면 복사본의 값이 원래 원본 변수에 재할당됩니다.

 

 

in-out은 copy-in copy-out의 줄임말입니다. 안으로 복사되고 다시 바깥으로 복사된다는 뜻입니다.

 

 

틀린 내용이나 오타는 댓글로 알려주시면 감사하겠습니다 :)

 

 

Reference

Swift 언어 가이드 - Functions

Swift 문법, in-out 매개변수 특징 및 사용방법