[Swift] inout 입출력 매개변수 / 함수 전달인자 값이 아닌 참조로 전달하기

Kerri·2021년 6월 25일
0

iOS

목록 보기
9/11

안녕하세요 !

불량 사용자, 소수 만들기 문제에서 함수 매개변수를 입출력 매개변수인 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의 값이 바뀌는 것을 확인할 수 있습니다 :)

profile
안녕하세요 !

0개의 댓글