안녕하세요! 오늘은 클로저에 대해서 알아보겠습니다!
클로저는 프로그래밍할 때 정말 많이 쓰이고 많이 보여서 매우매우 중요합니다.
이제 알아보겠습니다!
공식 문서의 정의는 아래와 같습니다.
Group code that executes together, without creating a named function.
이름 있는 함수를 생성하지 않은채 함께 실행되는 코드의 그룹
즉, 클로저는 이름이 없는(익명) 함수(코드의 묶음)라고 생각하면 됩니다.
{ () -> Int in
return ...
}
이제 클로저의 형태에 대해서 이해가 가실까요? 아직 어렵다면 주어진 함수에 대해서 클로저로 바꿔보겠습니다!
func sub(a: Int, b: Int) -> Int {
return a - b
}
{ (a: Int, b: Int) -> Int in
return a - b
}
{ (a, b) in
return a - b
}
클로저는 이렇게 작성하시면 됩니다! 그런데 클로저1과 달리 클로저 2는 parameter의 타입을 명시도 안하고 리턴타입을 생략했네요.. 이처럼 클로저에는 문법을 간편화할 수 있는 여러 방법이 있습니다. 이에 대해서는 조금 이따 알아보도록 할게요!
swift는 함수형 프로그래밍 특징을 갖고 있는 언어 중 하나입니다. 함수형 프로그래밍 특징을 가지고 있는 언어의 특징 중 하나는 함수를 "일급 객체"로 취급한다는 점입니다.
swift 역시 함수를 "일급 객체"로 취급할 수 있습니다. 그렇다면 이름 없는 함수인 클로저 또한 일급 객체이겠죠?
일급객체는 다음과 같은 특징을 갖습니다.
함수는 타입이다.
1. 변수에 할당할 수 있다.
2. 함수를 호출할 때, "함수"를 파라미터로 전달할 수 있다.
3. 함수에서 함수를 반환할 수 있다.
클로저도 변수에 할당할 수 있고 함수의 파라미터로 전달할 수 있고 리턴값이 될 수 있다는 것을 의미합니다.
클로저는 일급객체여서 함수의 파라미터로 사용할 수 있다고 했습니다!
클로저를 파라미터로 사용할 때,
1. 클로저를 파라미터로 받는 함수를 정의하고
2. 함수를 실행할 때 파라미터 클로저 형태를 전달해야 합니다.
func closureParamFunction(closure: () -> Void){ // 정의
print("function start")
closure()
}
closureParamFunction(closure: { // 함수 실행문
print("closure start")
})
// "function start"
// "closure start"
클로저를 사용하는 이유는 여기에 포함되어 있습니다. 함수 정의문에 작성한 클로저 타입( ()-> Void) 만 지키면 개발자가 향후 원하는대로 정의할 수 있기 때문에 활용도가 매우 높아집니다.
이처럼 클로저는 용도에 따라 원하는 코드를 함수 실행 시 정의할 수 있다는 점에서 매우 유용하게 사용됩니다.