[iOS_Swift] inout Parameter에 대하여

2022. 2. 10. 21:07Programming/iOS_Swift

  오늘은 간단한 개념에 대해서 짚고 넘어가보려 한다. 원래는 제네릭 관련 글을 포스팅하려다가 공식 문서를 살펴보고 있었는데, 공식 문서 예시에서 inout 파라미터를 사용하고 있었다. 처음 보는 개념이어서 해당 개념을 학습하다가 결국 글까지 포스팅하게 됐다. 먼저 inout Parameter 공식 문서부터 살펴보자.

 

  총 세 문단으로 이뤄져 있고 핵심 내용만 요약해서 설명하면,

 

  함수의 파라미터들은 기본적으로 상수이다. 따라서, 함수의 파라미터 값들을 함수 내부 바디에서 바꾸려고 하면 컴파일 에러를 일으킨다. 만약 사용자가 파라미터의 값들을 바꿔주고, 해당 값이 함수가 끝난 뒤에도 유지되기를 원한다면 inout 파라미터를 사용할 수 있다.

  사용자는 inout 키워드를 파라미터 타입 좌측에 적어 둠으로써 사용할 수 있다. inout 파라미터는 함수 안으로 전달되어지는 값을 가지고 있고 함수에 의해 해당 값이 수정되어질 수 있다. 그 후, 수정되어진 값이 원래의 값을 대체할 수 있다. 

  사용자는 오직 변수만을 inout 파라미터로 전달할 수 있다. 사용자는 inout 파라미터를 전달할 때, 앰퍼샌드(&)기호를 변수명 바로 옆에 적어둠으로써 해당 변수가 함수에 의해 수정될 수 있다고 표현할 수 있다.

 

  공식문서의 설명만 봐서는 작동원리가 잘 안와닿을 수 있는데, 공식문서에서 친절하게 3줄 요약도 해줬다.

1. 함수가 호출될 때, 전달인자의 값은 복사되어진다.

2. 함수의 바디에서, 복사본(전달인자로부터 복사된 인자)은 수정되어진다.

3. 함수가 리턴될 때, 복사본의 값은 원래의 인자 값을 덮어쓰게 된다.

 

정리하면, inout Parameter란?

  함수 내부에서 수정되어질 수 있는 파라미터이고, 함수의 호출이 끝난 뒤 기존의 값을 수정되어진 파라미터 값으로 바꿔주는 파라미터이다.

 

  추가적인 이해를 위해 예시를 통해 보자.

  사용자는 군인의 수를 한 명씩 늘려주는 함수를 만들었다. 그런데, 함수의 바디에서 파라미터를 1씩 늘려주려고 하니까 파라미터 number는 상수라면서 수정이 불가능하다고 컴파일 에러가 일어난다. 이럴 때, number가 수정될 수 있게끔 inout 키워드를 넣어준다.

  inout 키워드를 사용해줬고 함수를 호출할 때, 변수명 옆에 앰퍼샌드 기호(&)를 사용해줬다. 그 결과, 복사된 인자가 수정되어졌고 복사된 인자의 값이 기존에 있던 변수의 값을 덮어 쓴 것을 확인할 수 있다.

 

왜 알아야 할까?

  활용할 수 있는 곳이 무궁무진할 것 같다. 간단하게 떠오르는 예시를 하나 꼽자면 군인의 수 말고도 시민의 수, 동물의 수 등등등 수를 세야하는 변수가 50개가 있다 해보자. 그런데, 원하는 변수의 수만 증가시켜주는 함수를 만들고 싶다. 이럴 때 inout파라미터를 활용한다면 함수 1개로 구현이 가능하다. 만약 inout 파라미터를 사용하지 않으면 극단적으로 50개의 함수를 만들어야 될 지도 모른다.

 

** 왜 알아야 할까? 부분은 현재까지 제가 느낀 사견이기 때문에, 틀릴 수도 있습니다. 내용이 잘못됐다면 언제든 지적해주세요!