Swift - inout을 알아보자

김재형·2024년 7월 15일
0
post-custom-banner

InOut이 무엇일까?

함수 매개변수로 전달되는 값타입들 (String, Array, struct, Enum 등) 은
모두 상수로 받아지는것을 알고 계신가요?

var count = 0

func test(_ number: Int) {
	number += 1 // Cannot assign to value: `number` is a `let` constant
}

이말은 즉 매개변수로 받은 값을 변경하는것은 불가능 합니다
그렇다면 inout 는 무엇일까요?

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

해당 하는 코드를 보며 다시 생각해 보죠

임시값 복사 (Copy-In):

  • modifyValue 함수가 호출될 때, number 변수의 값 5가 임시 변수에 복사됩니다.
    임시 변수는 함수 내부에서 사용됩니다.

함수 내부에서 복사본 사용:

  • 함수 내부에서 value는 임시 변수로 동작합니다.
    value += 10이 실행되어 임시 변수의 값이 5에서 15로 변경됩니다.

수정된 값 반환 (Copy-Out):

  • 함수가 종료될 때, 임시 변수의 값 15가 원래 변수 number로 복사됩니다.
    결과적으로 number의 값이 15로 업데이트됩니다.

Call by Value

함수가 호출될 때 매개변수의 복사본이 함수로 전달됩니다.
함수 내부에서 매개변수를 변경해도 원본 변수는 영향을 받지 않습니다.

Call by Reference

함수가 매개변수의 참조(메모리 주소)를 전달받습니다.
즉, 함수 내부에서 매개변수를 변경하면 원본 변수도 영향을 받습니다.

inout은 Call by Value 일까 Call by Reference 일까?

자 위에서도 언급했지만 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인지 명확한 답을 내리지 못해서 아쉽습니다.
혹시 아시는 분들은 알려주시면 바로 반영하겠습니다! 저도 계속 찾아보고 업데이트 해보도록 하겠습니다!
긴글 읽어 주셔서 감사합니다.

profile
IOS 개발자 새싹이
post-custom-banner

0개의 댓글