나의 발자취

입출력 inout 파라미터 본문

앱 개발/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) 가변파라미터(여러개의 파라미터)로 선언하는 것 불가능
=============================================**/
Comments