-
Swift - ClosureProgramming/Swift 2020. 10. 11. 17:06
오늘은 Closure에 대해서 공부하겠습니다!
같이 공부한 Function Type을 잘 이해하셨다면 어렵지 않게 이해하실 수 있으실 거예요.
Closure란 어떠한 기능을 하는 코드 블럭을 의미합니다. 어디서 많이 들어본 의미인 거 같죠?
우리가 이전에 공부했던 함수도 Closure에 속합니다.
Named Closure과 Unnamed Closure
Closure는 자세히 나누면
- Named Closure
- Unnamed Closure
으로 나눌 수 있습니다.
그리고 Named Closure에는 Global Function과 Nested Function이 있습니다.
이 둘은 Function과 Nested Function으로 부릅니다.
Unnamed Closure에는 Anonymous Closure가 있습니다.
지금부터 Closure라고만 표기하면 모두 Anonymous Closure를 의미합니다.
Closure는 함수와 마찬가지로 First-class Citizen입니다.
- 상수와 변수에 저장할 수 있고
- Parameter (파라미터)로 사용할 수 있고
- Return (리턴) 값으로 사용할 수 있습니다.
파라미터와 리턴 값으로 사용할 수 있다는 의미는 Type (타입)이 존재한다는 의미입니다.
그리고 클로저의 타입은 함수의 타입과 같습니다.
그럼 Closure는 왜 사용할까요??
함수와 같이 계속 재사용을 하지 않고 한 두 번 파라미터로 전달을 해야 할 때 사용하면 유용합니다.
뒤에서 공부할 Syntax Optimization(문법 최적화)를 통하여 코드가 매우 간단해지 때문입니다.
Closure 선언
클로저를 생성하는 방법은 함수와 비슷합니다.
차이점은 func 키워드와 이름이 없고 모든 구문이 {} 안에 들어가 있습니다.
함수 헤더에 해당하는 부분에서 name이 빠지고 모두 {} 안으로 들어왔습니다.
함수에선 {}로 헤더와 바디를 구분했죠?
클로저에서는 모두 {} 안에 있으니 in으로 헤더와 바디를 구분합니다.
만약 parameterType과 returnType이 없다면 생략이 가능하여
모양이 됩니다.
그럼 클로저를 한번 만들어 보겠습니다.
해당 클로저는 두 개의 정수를 받아 비교한 뒤 Boolean을 리턴하는 클로저입니다.
클로저의 타입은 무엇일까요???
함수 타입과 마찬가지로 (Int, Int) -> Bool입니다. 이 클로저를 compareClosure 상수에 저장했습니다.
그럼 상수 compareClosure의 타입도 (Int, Int) -> Bool입니다.
이 클로저를 호출해 볼까요?? 여기서 주의할 점은 클로저는 Argument Label을 사용하지 않습니다.
그러므로 클로저를 호출할 때
이렇게 호출하지 않도록 주의해야 합니다. Argument Label을 사용하면 다음과 같은 에러 메시지가 나옵니다.
Method에서 Closure를 Parameter로 이용해 보기
여기서 이용해볼 Method입니다.
다른 부분은 보지 말고 파라미터의 형식만 보도록 해요.
(String, String) -> Bool 타입의 클로저를 파라미터로 받습니다.
여기서 두 개의 문자열을 받아서 크기를 비교한 뒤 Boolean을 리턴하는 클로저를 만들겠습니다.
이렇게 () 안에 들어있는 클로저를 InlineClosure라고 합니다.
우리가 사용한 클로저를 따로 떼서 보겠습니다.
파라미터로 String Type인 lhs와 rhs를 받고 이를 비교하여 Bool을 리턴해주는 클로저입니다.
그럼 sort(by:) 메서드는 클로저에서 리턴한 Bool을 파라미터로 받아 우리가 원한 조건대로 배열을 정렬해줍니다.
Syntax Optimization (문법 최적화)
문법 최적화는 스위프트가 추론할 수 있는 부분은 모두 생략을 해서 클로저를 최대한 간단하게 만들어주는 것을 말합니다.
위에서 사용한 코드를 최적화시켜보겠습니다.
최적화를 할 때는 다음 5가지 순서를 따릅니다.
1. 파라미터 타입과 리턴 타입을 생략한다.
2. 파라미터와 in을 생략하고 구문에 사용된 파라미터는 Shorthand Argument Name으로 바꾼다.
여기서 Shorthand Argument Name은 $0부터 시작해서 $1, $2.... 를 차례대로 사용해야 합니다.
3. 남은 클로저 바디가 단일 return문이라면 return을 생략한다.
4. 클로저가 마지막 파라미터라면 Trailing Closure로 바꾼다.
아까는 () 안에 들어있는 Inline Closure였습니다. 하지만 클로저가 마지막 파라미터라면 Trailing Closure로 바꿔줍니다. Trailing Closure는 () 뒤에 오는 클로저입니다.
마지막 파라미터만 바꾸는 것입니다. 만약 마지막이 아닌 곳에 클로저가 파라미터로 있다면 Trailing Closure 바꿀 수 없습니다.9월 19일 추가 : Swift 5.3 부터 Multiple Trailing Closure가 가능합니다. 1
5. Argument Label을 삭제하고 ()가 비어있다면 ()도 생략한다.
아주 많이 간단해졌습니다. 문법 최적화를 많이 연습을 해서 처음과 마지막이 같은 코드인 것을 알아볼 수 있어야 합니다.
참고자료
https://docs.swift.org/swift-book/LanguageGuide/Closures.html
- 9월 19일 추가 [본문으로]
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Tuple Decomposition, Matching (0) 2020.10.13 Swift - Tuple (0) 2020.10.12 Swift - Function Notation, Function Type (0) 2020.10.09 Swift - Function Variadic, In-out Parameter (0) 2020.10.08 Swift - Function Parameter (0) 2020.10.07