오늘의 학습
후발대 수업에서 클로저를 다뤘다.
악명(?)은 이미 잘 알고 있었지만, 나름 이해가 되는 시점이 종종 있었다.
클로저는 흔히 이름없는 함수 라고 한다.
*하지만, 클로저가 있기에 함수가 존재한다고 할 수 있는만큼 정말 중요한 구성원이다.
let newClosure: (String) -> (String)
위의 코드가 클로저를 의미한다.
자세히 보면 함수에서 사용하는 파라미터와 비슷한데, 정확하다!
클로저는 익명 함수로써 다양한 특징들을 가지고 있는데,
1. 변수에 할당이 가능
2. 파라미터로 전달 가능
3. 함수에서 함수를 반환시킬 수 있음
1,2번 같이 여러 곳에서 사용이 가능한, 던져질 수 있는 함수이기에
1급 객체(first citizen)라고 불리기도 한다.
변수에 할당 가능한 클로저
// 함수
func newFunction(_ param: String) -> String {
return param + "!!!"
}
// 클로저
var a: (String) -> String = newFunction
a("HI")
// prints 'HI!!!'
위의 함수 구조를 보면, 넣어진 파라미터를 사용하여 !!!를 더한 String 값을 반환하고 있다.
클로저는 복잡해 보이지만, 쉽게 이해할 수 있는 포인트가 존재한다!
'='을 기준으로 잡으면 이해하기 쉬울 듯하다.
1. 수학과 달리 코딩의 기본은 "'=' 우측에 있는 값을 왼쪽에 대입한다".
2. Swift를 포함한 모든 언어에서 타입을 사용하는데, 선언은 아래와 같이 한다.
let newString: String = "value"
// 변수명 : 타입 = "값" 의 형식을 가진다.
이를 참고하면 클로저도 쉽게 이해가 될 수 있다.
(String) -> String 타입을 가진 'a'라는 변수에게 newFunction이라는 값을 할당한다.
하지만 newFunction은 함수로, 파라미터로 넣는 값과 반환 값이 일치해야만 할당할 수 있다는 점!
따라서 함수를 변수가 머금고 있기에 변수 뒤에 () 실행 구문을 넣으면 값이 반환되는 것이다.
예전보다 조금은 더 쉽게 이해가 되고 있는 중이다.
다양한 간소화 방식
func performClosure(param: (String) -> Int) {
param("Swift")
}
//1 parameter 타입 제거
performClosure(param: { str in
return str.count
}
//2 parameter 표시 제거
performClosure { str in
return str.count
}
//3 활용 값 대신
performClosure {$0.count}
*별도로 중요했던 Escaping Closure에 대해서 내용이 있었는데, 이건 내일 멀끔한 정신 상태로 정리해보도록 하겠다!