In-Out 매개변수

KKANG·2021년 10월 1일
0
post-thumbnail

inout

Swift에서 함수의 매개변수는 Constant이므로 기본적으로 변경이 불가능하다. 하지만 함수 내에서 매개변수의 값을 변경하고싶은 경우 매개변수의 Data Type 앞에 inout 키워드를 붙여주면 가능하다.

call by reference

inout 매개변수는 아래와같이 동작한다.

  1. 함수가 호출되면 매개변수로 들어온 값이 복사된다.
  2. 함수 안에서 값이 변경된다.
  3. 함수가 반환될 때, 기존 변수 값에 변경된 값이 할당된다.

이 과정이 실행되는 원리는 호출되는 함수 밖과 함수 안에서 해당 매개변수의 주소값을 참조하는 구조이다. 때문에 inout 매개변수를 사용하는 함수에 인자를 넣을 때는 c에서와 유사하게 ampersand(&) 연산자를 붙여 표기한다.

주의

공식문서에서 inout 매개변수는 함수가 함수의 범위를 벗어날 수 있도록 하는 방법이라고 소개하고있는데_(an alternative way for a function to have an effect outside of the scope of its function body.), 잘못하면 Swift의 메모리 안정성을 위배할 수 있다.

var global = "Global Variable"

func function(_ param: inout String) {
    param += global
}

function(&global)
// error: Execution was interrupted, reason: signal SIGABRT.

위의 예시와 같이 전역변수를 inout 매개변수로 전달한 후 함수 내에서 전역변수를 동시에 사용하는 경우, read와 write가 동시에 수행되며 런타임에러가 발생한다.

따라서 함수 내에서 inout 매개변수로 전달된 변수에 접근해서는 안된다.

profile
재밌게 잘하자

0개의 댓글

관련 채용 정보