🔥 중첩 함수

346자
4분

Swift에서는 함수 내부에 또 다른 함수를 정의할 수 있는데, 이를 중첩 함수(Nested Functions)라고 합니다. 지금까지 우리가 살펴본 함수들은 모두 전역 함수(Global Functions)였죠. 전역 함수는 전역 범위에서 정의되는 함수를 말합니다. 반면에 중첩 함수는 다른 함수의 내부에서 정의되는 함수랍니다.

중첩 함수의 특징

중첩 함수는 기본적으로 외부에서 숨겨져 있어요. 하지만 그 함수를 포함하고 있는 바깥 함수에서는 중첩 함수를 호출하고 사용할 수 있습니다. 또한 바깥 함수는 자신의 중첩 함수 중 하나를 반환할 수도 있어요. 이렇게 하면 반환된 중첩 함수를 다른 범위에서 사용할 수 있게 됩니다.

중첩 함수 사용 예시

이전에 살펴보았던 chooseStepFunction(backward:) 예제를 중첩 함수를 사용하고 반환하는 형태로 다시 작성해 볼게요.

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 } // 입력값에 1을 더하는 중첩 함수
    func stepBackward(input: Int) -> Int { return input - 1 } // 입력값에서 1을 빼는 중첩 함수
    return backward ? stepBackward : stepForward // backward 값에 따라 중첩 함수 중 하나를 반환
}
 
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero는 이제 중첩 함수인 stepForward()를 참조합니다.
 
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue) // 중첩 함수 호출
}
print("zero!")
swift

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있어요.

-4...
-3...
-2...
-1...
zero!
text

chooseStepFunction(backward:) 함수 내부에는 stepForward(input:)stepBackward(input:) 두 개의 중첩 함수가 정의되어 있습니다. 이 함수들은 입력값을 1 증가시키거나 1 감소시키는 역할을 하죠.

그리고 chooseStepFunction(backward:) 함수는 backward 매개변수의 값에 따라 stepForward(input:) 또는 stepBackward(input:) 중 하나를 반환합니다.

let moveNearerToZero = chooseStepFunction(backward: currentValue > 0) 코드에서는 currentValue가 0보다 큰지 여부에 따라 반환할 중첩 함수가 결정됩니다. 여기서는 currentValue가 -4이므로 stepForward(input:) 함수가 반환되어 moveNearerToZero에 저장되는 거예요.

이제 while 루프에서 moveNearerToZero(currentValue)를 호출하면 stepForward(input:) 중첩 함수가 실행되어 currentValue를 1씩 증가시키면서 0에 가까워지게 됩니다.

이처럼 중첩 함수를 활용하면 함수 내부에서만 사용되는 작은 기능들을 캡슐화하고, 필요에 따라 외부에 노출시킬 수 있어요. 코드의 가독성과 재사용성을 높이는 데 도움이 되죠.

중첩 함수는 Swift에서 함수형 프로그래밍 패러다임을 지원하는 강력한 기능 중 하나랍니다. 함수를 일급 객체로 취급하여 함수 간의 결합도를 낮추고, 함수를 값으로 전달하고 반환할 수 있게 해줍니다. 이를 통해 더욱 유연하고 표현력 있는 코드를 작성할 수 있게 되는 거죠!