함수 (Functions) - 함수 타입 (Function Types)

00yhsp·2024년 4월 7일

모든 함수는 파라미터 타입과 반환 타입으로 구성된 특정 함수 타입 (function type) 이 있다.
예를 들어:

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
    return a * b
}

이 예제는 addTwoInts 와 multiplyTwoInts 라 불리는 간단한 수학 방정식 함수를 정의한다. 이 함수는 각각 2개의 Int 값을 가지며 적절한 수학 연산을 수행하여 Int 값을 반환한다.

이 두 함수의 타입은 (Int, Int) -> Int 이다. 이것은 아래와 같이 읽을 수 있다.

"함수는 모두 Int 타입인 2개의 파라미터를 가지며 Int 타입을 반환한다."

다음의 예제는 파라미터 또는 반환 값이 없는 함수이다.

func printHelloWorld() {
	print("hello, world")
}

이 함수의 타입은 () -> Void 또는 "함수는 파라미터가 없고 Void 를 반환한다."

함수 타입 사용 (Using Function Types)

Swift에서 다른 타입처럼 함수 타입을 사용한다. 예를 들어 함수 타입에 대해 상수 또는 변수로 정의 할 수 있고 변수에 적절한 함수 타입을 할당할 수 있다.

var mathFunction: (Int, Int) -> Int = addTwoInts

이것은 이렇게 읽을 수 있다.

"'2개의 Int 값과 Int 를 반환하는 함수' 의 타입을 가지는 mathFunction 이라는 변수를 정의한다. addTwoInts 라는 함수를 참조하기 위해 새로운 변수에 설정하시오."

addTwoInts(::) 함수는 mathFunction 변수와 같은 타입을 가지므로 Swift의 타입 검사기는 할당을 허락한다.

mathFunction 이라는 이름으로 할당된 함수를 호출할 수 있다:

print("Result: \(mathFunction(2, 3))")
// Prints "Result: 5"

비함수 타입과 동일한 방식으로 같은 타입으로 일치하는 다른 함수를 같은 변수에 할당할 수 있다.

mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 6"

다른 타입과 마찬가지로 상수 또는 변수에 함수를 할당할 때 함수 타입을 추론하기 위해 Swift에 맡길 수 있다.

let anotherMathFunction = addTwoInts
// anotherMathFunction is inferred to be of type (Int, Int) -> Int

파라미터 타입으로 함수 타입 (Function Types as Parameter Types)

(Int, Int) -> Int 와 같은 함수 타입을 다른 함수의 파라미터로 사용할 수 있다. 이렇게 하면 함수 호출자가 함수가 호출될 때 제공할 함수 구현의 일부 측면을 남길 수 있다.

다음의 예제는 위 수학 함수의 결과를 출력한다:

func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// Prints "Result: 8"

이 예제는 3개의 파라미터를 가지는 printMathResult(::_:) 라는 함수를 정의한다. 첫번째 파라미터는 mathFunction 이라 불리는 (Int, Int) -> Int 타입이다. 이 첫번째 파라미터의 인수로 해당 타입의 함수를 전달할 수 있다. 두번째 세번째 파라미터는 a 와 b 라 불리고 둘다 Int 타입이다. 이들은 제공된 수학 함수의 2개의 입력값으로 사용된다.

printMathResult(:::) 호출할 때 addTwoInts(:_:) 함수와 정수 3 과 5 가 전달된다. 3 과 5 로 제공된 함수를 호출하고 8 의 결과를 출력한다.

printMathResult(:::) 의 역할은 적절한 타입의 수학 함수를 호출하고 값을 출력한다. 이것은 함수의 실질 동작 구현이 어떻게 되는지는 상관없고 함수의 올바른 타입에 대해서만 관여한다. 이렇게 하면 printMathResult(:::) 가 해당 기능의 일부를 타입이 안전한 방식으로 함수 호출자에게 전달할 수 있다.

반환 타입으로 함수 타입 (Function Types as Return Types)

다른 함수의 반환 타입으로 함수 타입을 사용할 수 있다. 반환하는 함수의 반환 화살표 (->) 바로 뒤에 완전한 함수 타입을 작성하여 이를 수행한다.

다음 예제는 stepForward(:) 와 stepBackward(:) 라 불리는 간단한 2개의 함수를 정의한다. stepForward(:) 함수는 입력값에 1을 더해 반환하고 stepBackward(:) 함수는 입력값에 1을 빼고 반환한다. 두 함수 모두 (Int) -> Int 타입이다:

func stepForward(_ input: Int) -> Int {
    return input + 1
}
func stepBackward(_ input: Int) -> Int {
    return input - 1
}

다음의 함수는 반환 타입이 (Int) -> Int 인 chooseStepFunction(backward:)이다. chooseStepFunction(backward:) 함수는 backward 부울 파라미터를 토대로 stepForward(:) 함수 또는 stepBackward(:) 함수를 반환한다:

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    return backward ? stepBackward : stepForward
}

이제 chooseStepFunction(backward:) 를 사용하여 한방향 또는 다른 방향으로 이동할 함수를 얻을 수 있:

var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the stepBackward() function

위의 예제는 currentValue 라는 변수를 점차적으로 0에 가깝게 이동하기 위해 양수 또는 음수 단계가 필요한지 여부를 결정한다. currentValue 는 3 의 초기값을 가지며 이것은 currentValue > 0 이 true 를 반환한다는 의미이며 chooseStepFunction(backward:) 가 stepBackward(_:) 함수를 반환하도록 한다. 반환된 함수의 참조는 moveNearerToZero 라는 상수에 저장된다.

moveNearerToZero 가 올바른 함수를 참조하므로 0으로 계산하는데 사용할 수 있다:

print("Counting to zero:")
// Counting to zero:
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// 3...
// 2...
// 1...
// zero!
profile
iOS Dev

0개의 댓글