Swift - 함수(Function)란? (3)
Swift - 함수(Function)란? (3)
이전 글에 이어서 작성함.
inout이란?
- 함수의 매개 변수는 상수로 선언되어 있기 때문에 값을 직접 수정할 수 없음.
- 값을 수정해야할 경우 변수에 먼저 할당한 후에 수정이 가능함.
매개 변수 값 수정 예시
1
2
3
4
5
func test(num: Int){
num = num + 10
}
test(num: 10)
결과
1
2
3
error: MyPlayground.playground:2:5: cannot assign to value: 'num' is a 'let' constant
num = num + 10
^~~
변수 할당 예시
1
2
3
4
5
6
func test(num: Int) -> Int{
var num = num + 10
return num
}
print(test(num: 10))
결과
1
20
inout 키워드를 사용하면 매개 변수로 넘어오는 변수를 직접 수정할 수 있으며, 변수를 수정할 경우 매개 변수로 넘어온 변수값 자체가 같이 수정됨.
inout 사용 형식
1
2
3
4
func 함수명(매개변수: inout 데이터타입) -> 반환타입 {
실행 코드
return 반환값
}
사용 예시
1
2
3
4
5
6
7
func test(num: inout Int) {
num = num + 10
}
var number = 20
test(num: &number) // &: 변수의 주소값
print(number)
결과
1
30
일반적으로 매개 변수로 넘어가는 값은 값에 의한 호출(Call By Value)가 되어 변수 그 자체가 넘어가는 것이 아닌 복사본이 넘어가짐.
클래스의 경우엔 참조에 의한 호출(Call By Reference)가 일어나서
inout키워드가 필요 없음.
inout 키워드는 값에 의한 호출이 아닌 참조에 의한 호출을 받도록 해줌.
위 예시에서 확인할 수 있듯이, inout으로 선언된 매개 변수에 인자값을 넘겨줄 때는 &연산자를 통해 넘기는 것을 확인할 수 있는데, 이것은 변수의 주소값을 넘기겠다는 의미임.
C언어의 포인터와 유사한 개념임.
즉, 변수의 주소값을 넘겨받음으로써 복사본이 아닌 변수가 저장된 위치에 접근하기 때문에 함수 내부에서 변수의 값을 수정했을때 매개 변수로 넘어온 변수의 값도 같이 수정되는 것임.
그런 이유로 let으로 선언된 상수, 리터럴은 사용이 불가능함.
1
2
3
4
5
6
7
func test(num: inout Int) {
num = num + 10
}
let number = 20
test(num: &number) // 오류 발생
test(num: &10) // 오류 발생
This post is licensed under CC BY 4.0 by the author.