앱 개발/iOS
입출력 inout 파라미터
달모드
2022. 5. 23. 22:57
함수 내의 파라미터는 기본적으로 값타입이고(복사되어서 전달) 임시상수이기 때문에 변경이 불가하다. 이때 inout 키워드를 사용하면 참조로 전달하게 된다. 파라미터의 복사본이 전달되는 것이 아니라 원본의 주소가 전달된다. (내부적으로 copy-in copy-out 매커니즘이 실행된다.) 변수를 직접 넣었다가 뺀다고 생각하면 쉽다.
정의
하는 방법은 함수 파라미터를 할 때 파라미터 타입 앞에 inout 키워드를 추가한다.
func swapNumbers(a: inout Int, b: inout Int) {
...
}
실행 방법
swapNumbers(a: &num1, b: &num2)
위에서 inout 키워드로 선언하면 아래에서 호출할 때 자동으로 되지만, 변수를 전달할 때 & 기호를 꼭 붙어야 한다.(원본이 전달된다는 의미이다.)
주의사항
- 1) 상수(let)나, 리터럴 전달하는 것 불가능 swapNumbers(a: &a, b: &b) | swapNumbers(a: &123, b: &456) 불가
- 2) 파라미터의 기본값 선언을 허용하지 않음 func swapNumbers(a: inout Int = 5) 불가
- 3) 가변파라미터(여러개의 파라미터)로 선언하는 것 불가능 func swapNumbers(a: inout Int...) 불가
import UIKit
/*:
## inout 파라미터
* 함수를 통해, 변수를 직접 수정하고 싶은 경우는 어떻게 해야할까?
---
*/
//:>함수내의 파라미터는 기본적으로 값타입이고(복사되서 전달) 임시상수이기 때문에 변경 불가 원칙
var num1 = 123 // 전역변수
var num2 = 456 // 전역변수
func swap(a: Int, b: Int) {
// var c = a
// a = b
// b = c
}
swap(a: num1, b: num2) // 불가능하다.
/*:
---
* 함수 내에서 변수를 직접 수정하도록 돕는 inout키워드 (참조로 전달)
---
*/
//:> inout 키워드(선언시), & 사용(실행시)
num1 = 123
num2 = 456
func swapNumbers(a: inout Int, b: inout Int) {
var temp = a
a = b
b = temp
}
// 함수 실행시에는 앰퍼샌드를 꼭 붙여야함
swapNumbers(a: &num1, b: &num2)
print(num1)
print(num2)
// 입출력 파라미터는 내부적으로 copy-in, copy-out 메모리 모델를 사용하지만, 실제 원본이 전달된다고 쉽게 생각하면 됨
// *copy-in, copy-out - 값을 복사해서 함수 바디 내부로 전달하고,
// 함수가 종료될때, 아규먼트로 전달한 변수에 복사됨(함수 바디 내부에서 외부로 복사되어 전달)
/**==========================================
- inout파라미터 사용시 주의점
- 1) 상수(let)나, 리터럴 전달하는 것 불가능
- 2) 파라미터의 기본값 선언을 허용하지 않음
- 3) 가변파라미터(여러개의 파라미터)로 선언하는 것 불가능
=============================================**/