내일배움캠프 38일차

임클·2025년 4월 23일

내일배움캠프

목록 보기
39/44
post-thumbnail

하루하나 알고리즘

Swift 클로저와 함수 차이점 및 활용 TIL

함수(Function)

  • 정의: 특정 작업을 수행하는 독립적인 코드 블럭
  • 특징
    • 이름이 반드시 존재
    • 매개변수(Parameter), 반환 타입(Return Type) 명시
    • 호출 시 함수 이름으로 참조
  • 선언 예시
func add(a: Int, b: Int) -> Int {
    return a + b
}
let result = add(a: 2, b: 3) // 5

클로저(Closure)

  • 정의: 주변 문맥(Context)를 캡처하여 코드 블럭으로 표현한 익명 함수
  • 특징
    • 이름이 없거나 변수에 할당 가능
    • 주변 범위의 변수나 상수를 참조해서 캡처
    • 전역 함수, 중첩 함수, 후행 클로저(Trailing Closure) 등 다양한 형식 지원
  • 선언 예시
let multiply: (Int, Int) -> Int = { (x, y) in
    return x * y
}
let result2 = multiply(3, 4) // 12

함수와 클로저 비교

  • 이름 유무: 함수는 이름이 반드시 필요하지만 클로저는 무명으로 선언 가능
  • 정의 위치: 함수는 전역 또는 타입 내에 정의하지만 클로저는 변수나 상수에 할당할 수 있음
  • 캡처 기능: 클로저는 외부 변수 캡처가 가능하며, 함수는 전역 함수 제외 캡처 불가
  • 문법 차이: 클로저 축약형 문법과 후행 클로저 사용 가능

클로저가 일급 객체인 이유

Swift에서 클로저는 다음 조건을 모두 만족하므로 일급 객체로 취급한다.

  1. 변수나 상수에 할당할 수 있다
  2. 함수의 매개변수로 전달할 수 있다
  3. 함수의 반환 값으로 사용할 수 있다

예시

func perform(operation: (Int, Int) -> Int, a: Int, b: Int) -> Int {
    return operation(a, b)
}
let sum = perform(operation: add, a: 5, b: 7) // 12

함수형 프로그래밍에서 클로저 활용

  • 고차 함수(Higher-Order Function): map, filter, reduce 등을 통해 간결한 데이터 처리
  • 불변성(Immutability) 유지: 원본 데이터를 변경하지 않는 순수 함수 작성
  • 함수 조합(Function Composition): 작은 함수들을 조합해 복잡한 로직 구현
  • 커링(Currying): 인자를 단계별로 전달해 함수 단순화

예시

let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }      // [2, 4, 6, 8, 10]
let even = numbers.filter { $0 % 2 == 0 } // [2, 4]
let sumAll = numbers.reduce(0) { $0 + $1 } // 15

주의사항

  • 클로저 캡처로 인한 메모리 순환 참조(Strong Reference Cycle)에 유의
  • self 캡처 시 [weak self], [unowned self] 사용 권장

0개의 댓글