inout 매개변수(입출력 매개변수)

니냐뇨·2022년 9월 18일
0
post-thumbnail

매개변수의 값은 바뀔 수 없나요?


Swift에서 함수의 매개변수 값은 기본적으로 상수(Constant)이기 때문에 바뀔 수 없습니다.


inout을 이용하면..?


하지만, inout 매개변수를 사용하면 이처럼 매개변수의 값을 바꿀 수 있게 됩니다.
이를 이용하여 매개변수를 수정하고 함수 호출이 종료된 후에도 변경 사항을 유지할 수 있게 됩니다.


inout 매개변수로 전달될 변수 앞에는 &를 붙여서 해당 값이 함수 내에서 변경 될 수 있음을 나타내야 합니다.


inout의 작동 순서

inout이 어떻게 작동하냐구요? 다음과 같습니다.
1. 함수를 호출 할 때, 전달인자로 넘겨지는 값을 복사합니다.
2. 함수의 body에서 해당 전달인자의 값이 변경되면 그 복사한 값을 수정합니다.
3. 함수를 반환 할 때, 변화한 값을 원래의 매개변수에 할당합니다.


주의 할 점(메모리 관리)

입출력(inout) 매개변수는 함수의 실행과 동시에 입출력 매개변수에 대한 쓰기 접근이 시작되고 함수가 종료 될 때 쓰기 접근을 종료합니다.
이때, 다른 코드로 인해 inout 매개변수로 전달되는 변수에 대한 메모리 접근 타이밍이 겹치게 되면 충돌이 발생하게 됩니다.
따라서 아래의 케이스와 같은 경우 등을 유의하며 사용해야합니다.

case 1


위 코드의 경우에는
step이 increment(_:) 함수의 입출력 매개변수로 전달되었는데, 함수 내부에서 같은 메모리 공간에 읽기 접근을 시도해서 메모리 접근 충돌이 발생했습니다.
이 경우에는 런타임 오류가 발생하며, 다른 변수를 추가하여 해결이 가능합니다.

case 2


위 코드의 경우에는 같은 변수를 동시에 입출력 매개변수로 전달하여 메모리 접근 충돌이 발생했습니다.
이 경우에는 컴파일 오류로 알려줍니다.

주의 할 점(함수형 프로그래밍 패러다임)

Swift는 함수형 프로그래밍 패러다임을 지향합니다.
하지만 입출력 매개변수를 사용하면 외부 상태에 의존적이 되고, 부작용을 낳을 수 있기 때문에 사용이 지양되는 패턴입니다.


Reference

야곰 - 스위프트 프로그래밍(3판)

profile
열심히 살자.

0개의 댓글