함수 매개변수로 전달되는 값타입들 (String, Array, struct, Enum 등) 은
모두 상수로 받아지는것을 알고 계신가요?
var count = 0
func test(_ number: Int) {
number += 1 // Cannot assign to value: `number` is a `let` constant
}
이말은 즉 매개변수로 받은 값을 변경하는것은 불가능 합니다
그렇다면inout
는 무엇일까요?
inout
매개변수는 함수가 매개변수의 값을 직접 수정할 수 있도록 합니다.
func test(_ value: inout Int) {
value += 1
}
var number = 5
test(&number)
엠퍼센트라고 불리우며, inout 매개변수를 함수에 전달할 때 사용되며, 매개변수를 수정할수
있도록 허용합니다. 다시말해 &붙은 변수를 참조로 전달하겠다를 명시한다고 생각해주세요!
C언어의 *(포인터)와 비슷하지만 다르다는점!
copy-in copy-out 방식으로
copy-in
함수가 호출되면 인수값이 복사
됩니다.
값 타입의 변수는 값을 복사하고, 참조 타입의 변수는 참조를 복사합니다.
함수 본문(내부)에서 복사본을 수정합니다.
Copy-Out
함수 반환시 변경된 복사본의 값이 원래의 인수에 재 할당 됩니다.
func modifyValue(_ value: inout Int) {
value += 10
}
var number = 5
modifyValue(&number)
print(number) // 출력: 15
해당 하는 코드를 보며 다시 생각해 보죠
함수가 호출될 때 매개변수의 복사본이 함수로 전달됩니다.
함수 내부에서 매개변수를 변경해도 원본 변수는 영향을 받지 않습니다.
함수가 매개변수의 참조(메모리 주소)를 전달받습니다.
즉, 함수 내부에서 매개변수를 변경하면 원본 변수도 영향을 받습니다.
자 위에서도 언급했지만 inout은 "copy-in copy-out" 방식을 사용합니다.
다시 나열하면
Call by Value - 값전달: 매개변수의 복사본이 함수에 전달 -> 함수 내부에서 변경해도 원본 변수는 영향을 받지 않죠.
Call by Reference - 참조 전달: 매개변수 참조가 함수에 전달 -> 함수 내부에서 변경하면 원본 변수도 영향을 받죠.
inout은?:
"copy-in copy-out" 방식을 사용하여 함수가 매개변수의 값을 직접 수정할 수 있도록 합니다.
함수 호출 시 값이 복사되고, 함수 종료 시 수정된 값이 원래 변수에 다시 복사됩니다.
아직 정확하진 않지만 이 둘 (Call by Value, Call by Reference) 를 섞어 넣은 방법이지 않을까
라고 추측하고 있습니다.
마지막부분에서 Call by Value인지 Call by Reference인지 명확한 답을 내리지 못해서 아쉽습니다.
혹시 아시는 분들은 알려주시면 바로 반영하겠습니다! 저도 계속 찾아보고 업데이트 해보도록 하겠습니다!
긴글 읽어 주셔서 감사합니다.