하루하나 알고리즘
Swift 클로저와 함수 차이점 및 활용 TIL
함수(Function)
- 정의: 특정 작업을 수행하는 독립적인 코드 블럭
- 특징
- 이름이 반드시 존재
- 매개변수(Parameter), 반환 타입(Return Type) 명시
- 호출 시 함수 이름으로 참조
- 선언 예시
func add(a: Int, b: Int) -> Int {
return a + b
}
let result = add(a: 2, b: 3)
클로저(Closure)
- 정의: 주변 문맥(Context)를 캡처하여 코드 블럭으로 표현한 익명 함수
- 특징
- 이름이 없거나 변수에 할당 가능
- 주변 범위의 변수나 상수를 참조해서 캡처
- 전역 함수, 중첩 함수, 후행 클로저(Trailing Closure) 등 다양한 형식 지원
- 선언 예시
let multiply: (Int, Int) -> Int = { (x, y) in
return x * y
}
let result2 = multiply(3, 4)
함수와 클로저 비교
- 이름 유무: 함수는 이름이 반드시 필요하지만 클로저는 무명으로 선언 가능
- 정의 위치: 함수는 전역 또는 타입 내에 정의하지만 클로저는 변수나 상수에 할당할 수 있음
- 캡처 기능: 클로저는 외부 변수 캡처가 가능하며, 함수는 전역 함수 제외 캡처 불가
- 문법 차이: 클로저 축약형 문법과 후행 클로저 사용 가능
클로저가 일급 객체인 이유
Swift에서 클로저는 다음 조건을 모두 만족하므로 일급 객체로 취급한다.
- 변수나 상수에 할당할 수 있다
- 함수의 매개변수로 전달할 수 있다
- 함수의 반환 값으로 사용할 수 있다
예시
func perform(operation: (Int, Int) -> Int, a: Int, b: Int) -> Int {
return operation(a, b)
}
let sum = perform(operation: add, a: 5, b: 7)
함수형 프로그래밍에서 클로저 활용
- 고차 함수(Higher-Order Function): map, filter, reduce 등을 통해 간결한 데이터 처리
- 불변성(Immutability) 유지: 원본 데이터를 변경하지 않는 순수 함수 작성
- 함수 조합(Function Composition): 작은 함수들을 조합해 복잡한 로직 구현
- 커링(Currying): 인자를 단계별로 전달해 함수 단순화
예시
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
let even = numbers.filter { $0 % 2 == 0 }
let sumAll = numbers.reduce(0) { $0 + $1 }
주의사항
- 클로저 캡처로 인한 메모리 순환 참조(Strong Reference Cycle)에 유의
- self 캡처 시 [weak self], [unowned self] 사용 권장