# Untitled

swift의 inout 키워드

- swift에서 함수의 파라미터는 기본적으로 값을 복사하여 집어넣는 call by value이다.

    - 즉, 함수의 인자로 어떤 값을 넣을 때, 그 값은 불변성을 지닌다. (함수 내부에서 인자로 들어온 값에 **어떤 값을 새로 할당하거나 변경할 수 없다는 말**!)

    - 실제로 변경을 하거나 새로 할당하려고 하면, `인자가 let 키워드로 된 변수이기 때문에 수정이 불가하다` 라는 에러를 볼 수 있다.

- 함수 내부에서 인자로 받은 값을 변형하겠다는 신호로 inout 키워드를 붙여줄 수 있다.

    - 함수 정의부에서 특정 파라미터의 타입 선언 전에 inout을 붙이면, 그 인자는 변경이 가능한 인자가 된다.

    - 함수를 호출하는 부분에서는 &키워드로 인자가 inout한 타입이라는 것을 명시해준다.

```javascript
func someFunc(_ num: inout Int) {
  // num은 내부에서 값의 할당, 변경이 가능
}

var a = 0
someFunc(&a)
```

- inout으로 들어가는 인자는

    - 우선 함수 파라미터로 들어가는 것이기 때문에 값에 대한 복사가 진행된다.

    - 함수 내부에서 복사된 값을 업데이트 하거나 새롭게 할당하는 과정이 진행된다.

    - 함수가 종료되면 내부에서 수정/재할당 된 값을 외부의 참조하는 값에 다시 할당한다. (마치 여기서 값의 참조가 일어난 것처럼 보인다. call by reference)

    - in 할 때 copy가 발생하고, out 할 때 새로운 값의 copy가 발생해서 in-copy out-copy를 줄여 inout이 된다. 

![Image](https://upload.cafenono.com/image/slashpagePost/20241022/114300_48tiUxQHf0Q0IpPdC1?q=80&s=1280x180&t=outside&f=webp)

For the site tree, see the [root Markdown](https://slashpage.com/hankyeol.md).
