Swift 클로저(Closure)
: Swift에서 클로저란 {} 형식의 '코드블럭'이다.
- 코드 안에서 사용될 수도 있고
- 매개변수로 전달 될 수도 있다.
클로저 형식
클로저 형식은 위 그림과 같다. 중괄호{} 안에 함수 형식과 유사하게 작성하면 된다.
in 문장 안에 코드블럭의 실질적인 내용이 적힌다.
클로저 예시
Int 매개변수를 인자로 받아 단순히 *2 한 값을 반환하는 doubler 함수를 작성하였다.
[1,2,3,4,5] 5개의 요소를 가지는 Int형 배열을 선언하고
- array.map()의 매개변수로 doubler 함수를 전달하였다.
- array.map()의 매개변수로 '클로저'로 doubler 함수의 내용을 구현하여 전달하였다.
둘의 결과는 [2, 4, 6, 8, 10]으로 당연하게도 서로 동일하다.
결과가 동일한데 굳이 클로저를 쓰는 이유는? 이점은?
: 한 두번 쓰고 말 것을 굳이 함수로 구현하여 메모리를 낭비할 필요가 없다.
==> 코드블럭인 클로저를 사용.
클로저 축약
Swift의 강점은 추정이다. 추정이 가능한 부분은 생략이 가능하다.
추정을 이용하여 클로저를 축약시켜 보자.
Int형 요소 5개를 가지는 array 를 선언하였다.
배열의 요소를 하나씩 참조하여 새로운 array를 만드는 .map 메소드를 호출한다.
.map 메소드의 매개변수는 배열 요소를 *2 시키는 구문을 클로저로 작성하여 넘겼다.
---------------------------------------------------
우선은 파라미터의 자료형 명시를 제거하였다.
(param1:Int) 를 param1으로 축약.
왜냐?
Int형 배열의 요소를 하나씩 참조한다. => 다시말해 파라미터는 무조건 Int형 값이 될 것이다.
추론이 가능하므로 생략도 가능하다.
---------------------------------------------------
다음으로 클로저 반환 타입 명시를 제거하였다.
param1 -> Int 를 param1 로 축약.
왜냐?
Int형 자료를 받아서 연산한 결과이므로 별도로 명시하지 않는다면 Int 형이 될 것이 추정 가능하다.
따라서 생략 가능.
---------------------------------------------------
return 문구를 제거하였다.
in return param1*2 를 in param1*2 로 축약.
왜냐?
in 뒤에는 보통 return 문이 나온다. 따라서 return 문일 것이라는 추론이 가능하므로 생략 가능.
---------------------------------------------------
파라미터 구문을 없애고 파라미터를 $0으로 변경하였다.
param 1 in param1*2 를 $0*2 로 축약.
왜냐?
파라미터는 $0, $1, $2, ... 이런식으로 참조 가능하다.
.map 메소드를 파라미터 하나씩만 참조하는 메소드이므로 $0만 사용 가능하다.
따라서 리턴문의 $0는 첫번째 파라미터 값임을 추정 가능하므로 생략 가능하다.
---------------------------------------------------
클로저의 원본과 축약 과정 전부 결과 값이 동일함을 알 수 있다.
극단적 축약
+) 만약 2개 요소를 참조하는 함수에 서로 곱하는 클로저를 축약 하면 {$0 * $1} 이 된다.
이런 경우에는 극단적으로 {*} 까지도 축약이 가능하다.
왜냐?
곱연산(*)은 왼쪽값과 오른쪽 값을 필요로 하는데, 2개 요소를 다루는 함수에 매개변수로 서로를 곱하는 클로저를 넘길 경우
왼쪽값과 오른쪽값이 $0과 $1임이 추론 가능하므로.
'Swift 기초' 카테고리의 다른 글
Swift 열거형 (Enum) (2) | 2019.03.30 |
---|---|
Swift 중첩함수 (0) | 2019.03.28 |
Swift 제너릭 (Generic) (0) | 2019.03.27 |
Swift 함수 기초 (2) | 2019.03.27 |
[Swift 기초] switch case 문 (0) | 2019.03.16 |