클로저(Closure)
클로저 - 이름이 없는(익명) 함수
- 클로저는 이름이 없는 함수(익명 함수) 를 의미하며, 함수와 유사한 방식으로 사용된다
- 클로저는 변수, 상수에 할당하거나 다른 함수의 파라미터로 전달할 수 있다
- 클로저는 함수의 코드 블록을 간결하게 표현할 수 있다는 특징이 있다
함수의 타입 표기법 (복습)
- 함수의 타입을 변수로 선언하는 방법을 알아보자
let functionA: (String) -> String
let functionB: (Int) -> ()
let functionC: (String) -> Void
함수와 클로저의 형태 비교
- 동일한 기능을 수행하는 함수와 클로저를 비교해보면, 클로저가 더 간결하게 표현되는 것을 알 수 있다
func add(a: Int, b: Int) -> Int {
let result = a + b
return result
}
let addClosure = { (a: Int, b: Int) -> Int in
return a + b
}
let addClosureSimplified: (Int, Int) -> Int = { a, b in
return a + b
}
print(add(3, 4))
print(addClosure(3, 4))
print(addClosureSimplified(3, 4))
클로저 문법 간소화
- 클로저는 리턴형 생략, 파라미터 타입 생략 등 문법적으로 간결하게 사용할 수 있다
let addNumbers = { (a: Int, b: Int) in
return a + b
}
let multiplyNumbers: (Int, Int) -> Int = { x, y in
return x * y
}
let showMessage = {
print("Swift 클로저 예제입니다.")
}
let doubleNumber = { number in
return number * 2
}
print(addNumbers(3, 4))
print(multiplyNumbers(2, 5))
showMessage()
print(doubleNumber(6))
함수의 1급 객체(First-class Object)로서의 특징
- Swift에서 함수는 1급 객체(First-class Object) 로 취급된다
- 함수와 클로저 모두 다음의 조건을 만족한다:
- 변수를 통해 저장, 전달 가능
- 다른 함수의 파라미터로 전달할 수 있음
- 다른 함수의 반환값으로 사용 가능
함수를 변수에 할당하여 사용하기
- 함수는 변수나 상수에 할당하여 호출할 수 있다
func makeGreeting(name: String) -> String {
return "안녕하세요, \(name)님!"
}
func makeFarewell(name: String) -> String {
return "안녕히 가세요, \(name)님!"
}
var messageGenerator: (String) -> String = makeGreeting
print(messageGenerator("Royce"))
messageGenerator = makeFarewell
print(messageGenerator("Royce"))
클로저를 변수에 할당하여 사용하기
let farewellMessage = { (name: String) -> String in
return "잘 가요, \(name)님!"
}
print(farewellMessage("Royce"))
요약
- 클로저는 이름이 없는 함수(익명 함수)이며, 변수나 상수에 할당하거나 함수의 인자로 전달할 수 있다
- 함수는 1급 객체로 취급되며, 변수에 할당되거나 파라미터로 전달되거나 반환될 수 있다
- 클로저는 함수와 문법적으로 유사하지만 더 간결하게 표현할 수 있는 특징을 가지고 있다