오늘은 inout 매개변수 사용법에 대해 공부해보도록 하겠습니다.
함수의 매개변수는 기본적으로 상수입니다. 그래서 매개변수로 받아온 값을 수정할 수 없는데요.
이럴 때 사용하는 것이 inout 매개변수 입니다.
inout은 함수의 매개변수의 할당된 값을 변경하려고 할 때 사용합니다.
매개변수로 받아온 값을 함수 내에서 변경할 때 사용하는 것입니다.
사용법은 아래와 같습니다. (예시를 위해 급하게 만들어 허접합니다..)
func start(){
var number = 0
print(number)
addOne(number: &number)
print(number)
}
func addOne (number: inout Int){
number += 1
}
start()
// 0
// 1
위와 같이 start()
함수에서 선언한 number라는 변수를 addOne()
이라는 함수에서 값을 변경할 때 inout
을 사용합니다.
addOne()
함수의 매개변수를 보시면 func addOne(number: inout Int)
처럼 inout
키워드를 매개변수의 타입 앞에 적어줍니다.
또한, start()
함수에서 addOne(number: &number)
를 보시면 함수를 호출할 때 변수 앞에 &
를 적어줍니다.
수정될 수 있음을 나타내기 위해 표시해두는 것이라고 합니다.
inout 매개변수는 다음과 같이 동작합니다.
- 함수가 호출되면 인수 값이 복사됩니다.
- 함수 본문에 들어가게 되면 1번에서 복사 해둔 값이 수정됩니다.
- 함수가 반환되면 2번에서 변경된 복사본의 값이 원래 인수에 할당됩니다.
위와 같은 방식을 copy-in copy-out 또는 call by Value result 방식이라고 합니다.
- inout 매개변수를 사용하여도 상수로 선언된 것은 변경할 수 없습니다.
- inout 매개변수는 기본값을 가질 수 없으며 가변 매개변수로 표시할 수 없습니다.
- 메모리 안정성을 해칠 수 있습니다. (메모리 안정성에 관한 것은 다음에 소개 하겠습니다..)
[참고]
https://docs.swift.org/swift-book/LanguageGuide/Functions.html