Swift 기초

Swift 클로저(Closure)

nightohl 2019. 3. 30. 13:55
반응형

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의 강점은 추정이다. 추정이 가능한 부분은 생략이 가능하다.

추정을 이용하여 클로저를 축약시켜 보자.

배열 요소 doubler

Int형 요소 5개를 가지는 array 를 선언하였다.

배열의 요소를 하나씩 참조하여 새로운 array를 만드는 .map 메소드를 호출한다.

.map 메소드의 매개변수는 배열 요소를 *2 시키는 구문을 클로저로 작성하여 넘겼다.

---------------------------------------------------

추론을 이용한 클로저 축약1

우선은 파라미터의 자료형 명시를 제거하였다.

(param1:Int) 를 param1으로 축약.

왜냐?

Int형 배열의 요소를 하나씩 참조한다. => 다시말해 파라미터는 무조건 Int형 값이 될 것이다.

추론이 가능하므로 생략도 가능하다.

---------------------------------------------------

추론을 이용한 클로저 축약2

다음으로 클로저 반환 타입 명시를 제거하였다.

param1 -> Int  를 param1 로 축약.

왜냐?

Int형 자료를 받아서 연산한 결과이므로 별도로 명시하지 않는다면 Int 형이 될 것이 추정 가능하다.

따라서 생략 가능.

---------------------------------------------------

추론을 이용한 클로저 축약3

return 문구를 제거하였다.

in return param1*2 를 in param1*2 로 축약.

왜냐?

in 뒤에는 보통 return 문이 나온다. 따라서 return 문일 것이라는 추론이 가능하므로 생략 가능.

---------------------------------------------------

추론을 이용한 클로저 축약4

파라미터 구문을 없애고 파라미터를 $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