iOS/Swift

Swift 에서의 일급 함수 (First-Class Function)

태애니 2025. 3. 18. 22:43
728x90

1. 정의

Swift에서 함수는 일급 객체로 취급되며, 변수에 저장하거나 다른 함수의 인자로 전달할 수 있고, 반환값으로 사용할 수도 있다.

 

 


2. 개념

일급 함수
프로그래밍에서 함수가 일반적인 데이터(정수, 문자열 등)처럼 취급될 수 있는 개념을 의미한다. 즉, 함수 자체를 값처럼 활용할 수 있으며, 변수에 저장하거나 다른 함수에 인자로 전달할 수 있고, 함수의 반환값으로도 사용할 수 있다.

 

주요 특징

  • 변수에 할당 가능
    • 함수를 변수나 상수에 저장할 수 있다.
  • 함수의 인자로 전달 가능
    • 다른 함수의 매개변수로 함수를 전달할 수 있다.
  • 함수의 반환값으로 사용 가능
    • 함수가 다른 함수에서 반환될 수 있다.

3. 문법 코드

// 함수를 변수에 할당 가능
let add: (Int, Int) -> Int = { (a, b) in return a + b }
let result = add(3, 5) // 8

// 함수를 매개변수로 전달 가능
func applyFunction(_ fn: (Int, Int) -> Int, _ a: Int, _ b: Int) -> Int {
    return fn(a, b)
}
let sum = applyFunction(add, 4, 5) // 9

// 함수를 반환값으로 사용 가능
func makeMultiplier(_ factor: Int) -> (Int) -> Int {
    return { number in number * factor }
}
let double = makeMultiplier(2)
let doubledValue = double(5) // 10



// 클로저 축약형 예시
let multiply: (Int, Int) -> Int = { $0 * $1 }
let product = multiply(3, 4) // 12

4. 예시 코드

// 더하기 함수를 변수에 저장하여 사용
let addFunction: (Int, Int) -> Int = { $0 + $1 }
let result1 = addFunction(10, 20) // 30

// 배열의 각 요소를 변환하는 함수 적용
let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 } // [1, 4, 9, 16, 25]

5. 사용 시 주의할 점

  • 클로저 캡처에 주의해야 한다.
    • 클로저 내부에서 외부 변수를 참조할 경우, 캡처 방식(strong, weak 등)에 따라 메모리 관리에 영향을 줄 수 있다.
class Sample {
    var value = 10
    lazy var closure: () -> Void = { [weak self] in
        print(self?.value ?? 0)
    }
}
  • 함수 타입을 명확히 지정해야 한다.
    • 타입 추론이 가능하지만, 명시적으로 지정하면 가독성과 유지보수성이 높아진다.
let operation: (Int, Int) -> Int = { $0 + $1 }

6. 정리

  • 객체지향 언어이자 함수형 언어이기 때문에 함수가 일급 함수의 조건에 부합한다.
  • Swift에서 함수는 변수에 저장, 인자로 전달, 반환값으로 활용할 수 있다.
  • 클로저를 활용하면 더 간결한 문법으로 표현할 수 있다.
  • 메모리 관리 및 타입 명시성에 주의해야 한다.
728x90