[Swift] inout 매개변수는 무엇인가?

작성일 :

개요


Swift에서 inout 매개변수는 함수 호출 시 매개변수에 대한 참조(reference)를 전달하는 방법으로, 함수 내에서 매개변수의 값을 직접 변경할 수 있는 기능을 제공합니다. 이 글에서는 Swift에서 inout 매개변수가 어떤 것인지, 어떻게 사용하는지, 그리고 주의사항에 대해 설명하겠습니다.

기본적인 함수 매개변수


Swift에서 함수의 매개변수는 기본적으로 값(value)으로 전달됩니다. 이는 함수 내에서 매개변수의 값이 변경되어도 호출한 곳에서는 영향을 받지 않는다는 의미입니다. 예를 들어, 다음과 같은 함수가 있다고 가정해 봅시다.

swift
func addOne(num: Int) -> Int {
    return num + 1
}

var myNum = 5
let result = addOne(num: myNum)
print(myNum)    // 출력: 5
print(result)   // 출력: 6

위 함수에서 매개변수로 전달한 **myNum**의 값은 함수 내에서 **num**이라는 이름으로 사용되지만, 함수가 반환한 값에는 아무런 영향을 미치지 않습니다. 따라서 **myNum**의 값은 함수 호출 이전과 동일한 5가 출력됩니다.

inout 매개변수


Swift에서 inout 매개변수를 사용하면 함수가 호출될 때 매개변수에 대한 참조(reference)를 전달하게 됩니다. 이는 함수 내에서 매개변수의 값을 직접 변경할 수 있게 해줍니다. inout 매개변수를 사용하려면 매개변수 이름 앞에 inout 키워드를 붙여주면 됩니다.

예를 들어, 다음과 같은 함수가 있다고 가정해 봅시다.

swift
func addOne(inout num: Int) {
    num += 1
}

var myNum = 5
addOne(num: &myNum)
print(myNum)    // 출력: 6

위 함수에서 매개변수 num은 inout 매개변수로 선언되어 있습니다. 이 함수를 호출할 때에는 & 연산자를 사용하여 매개변수에 대한 참조를 전달해야 합니다. 함수 내에서 num의 값을 1 증가시킨 후, 호출한 곳에서도 변경된 값을 확인할 수 있습니다.

inout 사용시 주의 사항


  • inout 매개변수는 값이 변경되므로 가능한 사용을 자제해야 합니다. 특히, 다른 변수에 할당하지 않고 값을 직접 변경하는 경우 함수의 결과를 예측하기 어려워질 수 있습니다.
  • inout 매개변수는 함수 내부에서 값이 변경될 때만 유효하므로 함수 외부에서는 inout 매개변수를 사용할 수 없습니다.
  • inout 매개변수는 함수 호출 시 값이 복사되는 것이 아니라 참조로 전달되므로, 참조 타입에서만 사용 가능합니다. 값을 복사하는 value 타입에서는 inout 매개변수를 사용할 수 없습니다.
  • inout 매개변수는 기본값을 가질 수 없습니다. 함수를 호출할 때 항상 값을 전달해야 합니다.

함수의 매개변수 선언 시 사용하는 키워드


@autoclosure, @escaping 와 같이 inout과 유사하게 함수의 매개변수로 받는 키워드들이 있습니다. 이 키워드들은 간략히 설명하고 나중에 기회가 되면 자세히 다뤄보도록 하겠습니다.

  • @autoclosure: 전달할 인자를 자동으로 클로저로 래핑하여 전달하는 키워드입니다. 이를 사용하면, 인자로 전달되는 표현식이 불필요하게 미리 평가되지 않도록 할 수 있습니다.
  • @escaping: 클로저를 매개변수로 받는 함수에서 해당 클로저를 외부에서 참조할 수 있도록 허용하는 키워드입니다. 이를 사용하면, 해당 함수 내에서 정의한 클로저를 함수 외부에서도 사용할 수 있습니다.