무수한 함수 포스팅을 헤쳐나와..
본격적인 프로그래밍을 진행하기에 앞서,
이곳 저곳에서 자주 사용하게 될 클로저(Closure)에 대해 살펴볼까 합니다.
함수보다 아주 조-금 머리아픈 복잡한 내용일 수 있으니
이번 포스팅에서는 클로저의 개념만 살짝 짚고 넘어가겠습니다.
클로저(Closure)에 대하여
익명함수(Unnamed) 외, 이름이 있는 함수(Named) 또한 클로저이다
The Swift Language Guide 에서 소개하는 클로저는 다음과 같습니다.
클로저(Closure)
코드블럭으로 C와 Objective-C의 블럭(blocks)과 다른 언어의 ❶람다(lambdas)와 비슷합니다.
클로저는 어떤 상수나 변수의 참조를 ❷캡쳐(capture)해 저장할 수 있습니다.
???
아무리 읽어봐도 도통 이해가 되질 않지만
후술할 클로저에 대한 내용을 바탕으로, 위 소개글에서 언급되는 키워드인
- ❶람다(lambdas)
- ❷캡쳐(capture)
두 가지 개념을 함께 다뤄봄으로서 해석해보도록 하겠습니다.
클로저와 클로저 표현식 (Closure Expression)간의 관계
- 흔히 클로저라고 하면, '함수와 같지만, 이름이 없는 함수구나~' 라고 해석하기 쉽습니다.
- 하지만, func 키워드를 활용한 이름이 존재하는 함수도 클로저에 포함됩니다.
- 클로저의 범위는 다음 그림과 같습니다.
- 지금까지 사용해 온 함수는 Named Closure 이며, Unnamed Closure는 클로저 표현에 해당합니다.
- 클로저 표현(Closure expression)은 흔히 익명함수, 또는 ❶람다(lambdas)함수로 불립니다 !
- '람다식', 혹은 '람다함수'란 익명함수를 지칭하는 언어로 다음과 같은 특징을 가지고 있습니다.
- 코드를 간결하게 만들고, 반복 관련 코드의 불필요한 부분을 제거함
- 주로 고차함수에 매개변수로 전달되거나, 결과값으로 활용
// 일반적으로 사용해오던 (전역)함수
func sayHello () {
print("Hello")
}
sayHello() // 출력 : Hello
// 클로저 표현식으로 변경해본다면?
let sayHello = { print("Hello")}
sayHello() // 출력 : Hello
Swift의 클로저
함수나 클로저 표현식과 같은 코드블럭과 하나 이상의 변수가 결합된 것
클로저의 유형, 그리고 표현식과 혼용해서 사용하므로 주의해야 한다는 점은 알겠는데..
클로저(Closure)란 용어 자체를 살펴보면
단어 그대로, 무언갈 가두고 있는(Closed) 형태로 해석이 되지 않나요?
클로저(Closure)란 용어의 의미
- 공학용어에 따른 클로저(Closure)는, 코드블럭과 변수(상수)가 결합된 것을 의미합니다.
- 코드블럭이라 함은, 함수나 클로저 표현식과 같은 독립적인 코드입니다.
- 변수(상수)란, 코드블럭과 관계를 맺고 있는 변수 혹은 상수입니다.
- 이해를 돕기위해, 예시 코드를 살펴보도록 하겠습니다.
- A란 이름의 함수는 ➟ 함수B를 반환(Return Type)합니다.
- 그런데, 함수 B는 코드블럭 외부에 선언된 'count' 변수에 의존하게 됩니다.
- 결과적으로, 함수B는 count변수를 ❷잡고(captured) 있습니다 !
- 함수 B는, count 변수를 잡거나(Captured), 가두고(Closed over)있게 됩니다.
func functionA() -> () -> Int {
// count란 변수가 선언되어 있으며,
var count: Int = 0
// 내부에 functionB 함수를 선언
func functionB() -> Int {
return count + 1
}
// functionA 함수는 functionB를 반환값으로 설정함
return functionB
}
// closureExample에 functionA를 할당하게 되고
let closureExample = functionA()
// 아래와 같이 결과를 호출하게 되면?
print("결과는?: \(closureExample())") // "결과는: 1"
클로저(Closure)에 대한 사전 소개는 여기까지 입니다.
이후 포스팅에서는
- 클로저 표현식 사용법
- 1급 객체로서의 클로저 조건 확인
- 경량 문법 및 autoclosure
- Capture
- 등등..
듣기만 해도 머리가 복잡해지는 개념과 예시코드를 다뤄보도록 하겠습니다.
'iOS > Swift' 카테고리의 다른 글
[iOS/Swift] 클로저 표현식을 간단하게! 문법 경량화 (0) | 2023.01.27 |
---|---|
[iOS/Swift] 클로저 표현식(Closure Expression)과 1급 객체 조건 (0) | 2023.01.26 |
[iOS/Swift] 1등 시민, 1급 객체함수 (First Class Citizen) (0) | 2023.01.18 |
[iOS/Swift] 함수의 타입(Type)과 형태를 알아보자! (0) | 2023.01.10 |
[iOS/Swift] 함수를 부르는 방식, 함수 표기법(Function Notation) (0) | 2023.01.09 |
댓글