inout 키워드

이진욱(JIN WOOK)·2024년 11월 10일
0

제비에관하여(Swift)

목록 보기
2/10

2024.11.10일에 네이버 블로그에서 작성된 글입니다.

주말간 문제를 풀어보며 제가 약한 문법에 대해서 공부하기로 했습니다.
이번에 야구 게임 프로젝트를 하면서 느꼈는데 진짜 문법부터 다시 공부해야된다고 판단 했습니다.
클래스와 구조체 차이도 정확하게 모르고 있었어요.


inout 키워드란 ?

함수내에 파라미터는 기본적으로 값타입(Value)입니다. -> 복사해서 사용한다는 의미 입니다.
그렇기에 직접적인 변경은 불가능합니다.

이렇게 파라미터에 선언된 변수에 값을 할당하려고 시도한다면

Cannot assign to value: 'a' is a 'let' constant
a는 let 이기 때문에 변경 불가능합니다.

라고 에러메세지가 뜨게 됩니다.

즉, 파라미터는 상수로써 선언이 됩니다.

입출력 파라미터는 copy-in, copy-out 메모리 모델를 사용한다고 합니다.
이 모델은 주로 값타입을 함수에 전달할때 사용합니다. (swift의 값타입 : 구조체, Enum, 튜플)
Value Types - 값타입에 관한 재밌는 예시가 있어서 링크 첨부합니다!

내용: 친구에게 문서의 복사본을 이메일로 보내고 친구가 문서 복사본을 수정해도 내가 가지고 있는 문서는 수정되지 않는다!
이게 값타입입니다.

copy-in 단계 : 원본값이 복사된 상태에서 함수를 호출합니다.
이경우 함수가 사용하는 로컬메모리에 저장이됩니다. 고로 이 복사본을 수정해도 원본 데이터는 영향 받지 않습니다.

copy-out 단계 : 함수가 종료될때 함수 내에서 수정한 값이 원본에 복사됩니다. (단, 값의 수정이 이뤄질때)

만약 함수에 존재하는 파라미터값의 수정을 원한다면 inout 키워드를 사용해서 함수의 파라미터에 붙여줍니다.

inout의 키워드를 선언하면 직접수정 할수 있는 권한을 얻게 됩니다.

함수 실행문에서는

이렇게 & 앰퍼샌드 기호를 붙여서 전달합니다.
-> 원본을 전달한다는 의미입니다.
결과는 어떻게 될까요?

print(num1) -> 2
print(num2) -> 1 이 되겠습니다.

inout을 적으면 let에서 var의 특성처럼 변한다고 생각해도 될꺼 같습니다.

up2 함수를 확인해보겠습니다.
정상적으로 1이 증가가 됐습니다.

print값은 0이 아닌 1입니다.
왜냐하면 copy-out단계에 의해서 함수가 종료가 되면 수정된 값을 원본 변수인 zero에 저장하기 때문입니다.

저는 이렇게 생각했습니다.
결국은 상수인 파라미터를 변수로 변환 시킨거 아닌가??

profile
기술로부터 소외 되는 사람이 없도록 우리 모두를 위한 서비스를 만들고 싶습니다.

0개의 댓글

관련 채용 정보