반응형

 

이번 글은 함수를 정의하는 방법과 호출 방법에 대한 지식을 기본적으로 알고 있어야 이해할 수 글이다. 또한 underscore(_)의 개념을 아직 잘 모르고 있다면 함수 사용 방법에 대한 글을 먼저 읽고 오는 것을 추천한다.

 

함수의 파라미터는 기본적으로 상수(Constant)이다. C, C++, Java, Python 등의 언어에서 함수의 파라미터는 변수로 사용되지만 Swift에서는 상수라는 것이 조금 독특하다. 전달받은 파라미터를 함수 내부에서 변경하려고 시도하면 컴파일 에러가 발생할 것이다. 당연히 변수가 아닌 상수를 변경하려고 시도했기 때문이다.

만약 함수의 파라미터를 함수 내부에서 변경하고 함수가 종료된 후에도 변경한 값이 지속되도록 하려면 변수의 주소값을 넘겨 직접 접근할 수 있도록 도와주는 inout 키워드를 사용하면 된다.

그러면 코드를 통해 어느 상황에, 어떻게 사용해야 하는지 알아보자.

우선 어느 상황에 inout 키워드를 사용해야 할까? 파라미터로 받은 값을 1을 증가시키는 함수를 정의해보자.

 

func addOne(value: Int){
    value += 1
    print(value)
}

 

value값을 1 증가시키기 위해서 value+=1(value = value + 1)을 사용하였는데 이상하게 아래와 같이 오류가 발생한다.

 

 

경고 창을 보면  ['value' is a 'let' constant] 라고 우리에게 알려준다. 처음에 Swift에서 파라미터는 기본적으로 상수(constant)이다. 상수는 변경할 수 없는데 value 값을 증가시키려고 시도했기 때문에 오류가 발생한 것이다. 자, 이제 이러한 문제를 inout 키워드로 해결해보자.

 

var number = 10
 
func addOne(value: inout Int){
    value += 1
    print(value)
}
 
addOne(value: &number)

 

inout 키워드를 사용하여 파라미터로 들어온 값을 1 증가시키고 출력하는 코드이다. 파라미터와 데이터 타입 사이에 inout 키워드를 사용하였으며 addOne()함수를 호출할 때 변수 명 앞에 앰퍼샌드(&) 기호를 붙여서 사용하였다. 이렇게 코드를 작성하면 우리가 원하는 변수 number의 값을 1 증가시킬 수 있다!

그리고 함수를 호출할 때 인자값으로 넘어가는 변수명 왼쪽에 &기호가 붙어있으면 함수 내부에서 수정될 것이라는 의미도 유추할 수 있다.

다음 코드로 변수의 값이 변경되기 전과 후의 값을 을 확인해보았다.

 

var number = 10
 
print("Before value : \(number)")
 
func addOne(_ value: inout Int){
    value += 1
    print("After value : \(value)")
}
 
addOne(&number)

 

아래 사진은 결과 값이다.

 

 

이를 응용하여 변수 a, b에 저장되어있는 숫자를 swap하는 코드를 작성해보았다.

 

func swapNumber(first: inout Int, second: inout Int){
    var temp = first
    first = second
    second = temp
}
 
var a = 10
var b = 20
 
print("Before Swap a : \(a), b : \(b)")
swapNumber(first: &a, second: &b)
 
print("After Swap a : \(a), b : \(b)")

 

이처럼 inout 키워드를 사용할 수 있는 다양한 경우들을 생각해보고 코드로 작성해보자. 본인이 예상한 것과 결과가 같은지, 틀리면 왜 틀렸는지 생각해보고 모르면 댓글을 남기거나 구글링을 해보자 :)

반응형

'언어 > Swift 5' 카테고리의 다른 글

[Swift 5] 함수의 오버로딩(Overloading)이란?  (0) 2020.03.24
[Swift 5] 함수 사용 방법  (0) 2020.03.23
[Swift 5] Any와 nil에 대하여  (0) 2020.03.06

+ Recent posts