[iOS] inout

eugenie8·2022년 4월 14일
0

Swift 에서 함수의 매개변수는
상수 [ Constant ] 이므로,
함수 내부에서 매개변수의 값을 변경할 수 없다.

// example1

func exampleFunction (_ name: String) {
	name = "Eugenie" // Error
}

위와 같이 매개변수 name
함수 내에서 값을 바꾸면
'name' is a 'let' constant 라는
에러 메세지가 나온다.

만약 함수에서 매개변수 값을 변경하고,
변경된 값이 함수 호출 후에도 지속되길 원한다면
inout 매개변수를 사용하면 된다.

inout 매개변수는
매개변수의 타입 앞에 inout 키워드를 추가하면 된다.

변수만을 취급하며, 함수의 인자로 전달할 때 & 를 사용하여,
해당 값이 함수 내부에서 변경될 것임을 나타내야 한다.

// example2

func swapNum(_ a: inout Int, _ b: inout Int) {
	let temp = 0
    a = b
    b = temp
}

var param_a = 1
var param_b = 100

swapNum(&param_a, &param_b)
print("a: \(param_a), b: \(param_b)")

inout 원리

inout 의 과정은 다음과 같다.

  1. 함수가 호출되면, 매개변수가 복사된다.
  2. 복사한 값을 함수 몸체에서 수정한다.
  3. 함수가 반환될 때, 수정된 값을 원본 변수에 재할당한다.

위의 과정을 'copy-in copy-out' 혹은
'call by value result' 라고 부른다.

❗️ inout 은 copy-in copy-out 의 약자

🚨 메모리 접근 주의

// example3

var num = 1

func countNum(_ number: inout Int) {
	number += num
}

countNum(&num)
// Error

변수 numnumber
같은 메모리 주소를 참조하고 있다.
일기, 쓰기가 동시에 이루어져 충돌이 발생할 수 있다.


📚 Reference
The Swift Programming language guide - Function
Swift - Inout 파라미터

profile
🌱 iOS developer

0개의 댓글