안녕하세요 !
불량 사용자, 소수 만들기 문제에서 함수 매개변수를 입출력 매개변수인 inout
으로 전달해서 풀었는데요.
실제 코테 문제에서 어떻게 사용했는지는 위 문제의 글을 참고하시면 됩니다 😄
오늘은 이 inout에 대해서 알아보겠습니다!
(** 야곰님의 Swift 프로그래밍 책을 참고해서 작성했습니다.)
Swift에서는 함수의 전달인자로 값을 전달할 때 보통 값을 복사해서 전달합니다!
값이 아닌 참조를 전달하려면 입출력 매개변수를 사용합니다!
값 타입 데이터의 참조를 전달인자로 보내면 함수 내부에서 참조하여 원래 값을 변경합니다.
저도 코테 문제에서 사용한 이유가...
함수 내부에서 어떤 로직을 수행한다음 원래 값을 변경하고 싶어서 입출력 매개변수로 사용을 했습니다.
왜냐하면 입출력 매개변수를 사용하면 외부 상태에 의존적이게 되고, 사이드이펙트를 발생할 수 있기 때문입니다.
함수 외부의 값에 어떤 영향을 줄지 모르게 되는 것이죠.
입출력 매개변수를 사용하는 방법에 대해 알아보고, 값 타입 매개변수와 참조 타입 매개변수를 비교해보겠습니다.
함수 매개변수 타입 앞에 inout
키워드를 붙여주고,
호출할때 전달되는 변수 앞에 앰퍼샌드(&)
를 붙여줍니다.
import Foundation
var numbers: [Int] = [1, 2, 3]
func nonReferenceParameter(_ arr: [Int]) {
var copiedArr: [Int] = arr
copiedArr[1] = 1
}
func referenceParameter(_ arr: inout [Int]) {
arr[1] = 1
}
nonReferenceParameter(numbers)
print(numbers[1]) // 2
referenceParameter(&numbers)
print(numbers[1]) // 1
nonReferenceParameter
함수는 값 타입 매개변수를 전달하니까 함수 내부에서 로직을 수행해도 외부 값이 바뀌지 않습니다!
referenceParameter
함수는 참조 타입 매개변수를 전달하니까 함수 내부에서 로직을 수행하면 numbers의 값이 바뀌는 것을 확인할 수 있습니다 :)