Function - 4
In-Out Parameters
- 함수의 매개변수는 기본적으로 상수이다(함수 내에서 이 값을 변경하면 컴파일 에러 발생).
- 만일 함수의 매개변수를 수정하거나 함수 호출 후에도 매개변수의 값을 변경된 값으로 유지하고자 한다면 매개변수를 in-out으로 지정해야 한다.
- in-out 매개변수는 매개변수 type 오른쪽 앞에 inout 키워드를 이용하여 만든다.
- in-out 매개변수로 전달된 값은 함수 내에서 수정 가능하며 함수 밖의 원래 값도 바꿀 수 있다.
- 함수를 호출 할 때 in-out 매개변수는 변수로만 전달 가능하고 상수나 값 자체를 전달할 수 없다.
- in-out 매개변수에 대한 인자를 명시적으로 전달할 때 인자 이름 앞에 &를 붙인다.
in-out 매개변수는 기본값을 가질 수 없으며 가변인자는 inout 키워드를 붙일 수 없다.
func swapTwoint (_ a: inout int, _ b: inout int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoint(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// someInt는 107이, anotherInt는 3이 출력됨
in-out 매개변수는 함수의 리턴과는 다른 방식으로 함수 밖에서 할당된 변수의 값을 변경할 수 있다.
함수의 Type
- 모든 함수는 매개변수와 리턴 type에 따라 독자적인 함수 type을 갖는다.
func addTwoInts(_ a: int, _ b: int) -> int {
return a + b
}
func multiflyTwoInts(_ a: int, _ b: int) -> int {
return a * b
}
func printHelloWorld() {
print("Hello, World")
}
- 앞의 두 함수는
(int, int) -> int
로 표시할 수 있으며 “모두 int type인 두 개의 매개변수를 갖고 반환값이 int type인 함수”라고 읽을 수 있다. - 세 번째 함수는
() -> Void
로 표시하고 “매개변수가 없고 Void를 반환하는 함수”라고 읽을 수 있다.
함수 Type의 이용
- 함수 Type은 Swift의 다른 Type과 동일하게 사용할 수 있다.
Var mathFunction: (int, int) -> int = addTwoInts
- 위 코드는 “mathFunction라는 변수를 ‘모두 int type인 두 개의 매개변수를 갖고 반환값이 int type인 함수’ Type으로 정의하고 이 새로운 변수가 addTwoInts 함수를 참조하도록 하였다”라고 표현할 수 있다.
addTwoInts(_:,_)
함수는 mathFunction 변수와 동일한 Type을 가지고 있기 때문에 할당시 Swift의 type-checker에 의해 통과된다.- 이제 mathFunction 변수를
addTwoInts(_:,_)
함수 대신 사용 가능하다.
print(“Result: \(mathFunction(2, 3))”)
// “Result: 5” 출력
- 동일한 타입을 갖는 다른 함수도 할당 가능하다.
mathFunction = multiflyTwoInts
print(“Result: \(mathFunction(2, 3))”)
// “Result: 6” 출력
- 다른 Type들과 마찬가지로 함수를 상수나 변수에 할당할 때 Swift는 알아서 Type을 유추하게 된다.
let anotherMathFunction = addTwoInts
// anotherMathFunction는 Swift가 (int, int) -> int Type으로 유추한다.