일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Radeon
- 라데온 베가
- radeon vega
- vega
- Rx5700
- navi
- Zen2
- 라이젠 오버클럭
- 라데온
- 나비
- 라이젠 젠2
- 암드 신제품
- 젠2
- vega 7
- Rx5000
- 라이젠 젠2 오버
- 라이젠 오버
- 라데온 신제품
- 암드
- 베가
- 라데온 나비
- 암드 라이젠 오버클럭
- 젠2 오버클럭
- ryzen zen2
- 라이젠
- Ryzen
- ryzen gen2
- AMD
- Today
- Total
SW
자동 클로저 (학습) 본문
자동 클로저 : 함수의 전달인자로 전달하는 표현을 자동으로 변환해주는 클로저를 자동 클로저 라고 한다.
자동 클로저는 전달인자를 갖지 않는다.
자동 클로저는 호출 되었을 때 자신이 감싸고 있는 코드의 결괏값을 반환한다.
자동 클로저는 함수로 전달하는 클로저를 (소괄호와 중괄호를 겹쳐서 써야하는) 어려운 클로저 문법을 사용하지 않고도 클로저로 사용할 수 있도록 문법적 편의를 제공한다.
자동 클로저는 호출되기 전까지는 클로저 내부의 코드가 동작하지 않는다. 따라 연산을 지연시킬 수 있다.
아래 예제코드를 보며 확인해 보자
var customersInLine: [String] = ["YoangWha", "SanggGon", "SungHe", "Romi"]
print(customersInLine.count) // 4
let customerProvider: () -> String = {
return customersInLine.removeFirst()
}
print(customersInLine.count) // 4
print("Now serving \(customerProvider())!")
print(customersInLine.count) //3
print("Now serving \(customerProvider())!")
print(customersInLine.count) //2
print("Now serving \(customerProvider())!")
print(customersInLine.count) //1
print("Now serving \(customerProvider())!")
print(customersInLine.count) //0
배열(Array)에서 removeFirst() 메서드는 자신의 배열에서 첫 번째 요소를 제거하면서 그 요소를 반환해주는 메서드이다. (복습했다..)
그래서 customerProvider()를 선언하였지만 바로 아래서 호출된 카운트에서는 연산 자체가 반영되지 않았다.
바로 다음의 print("Now serving \(customerProvider())!")으로 실행 시킴으로써 카운트에 반영되는 것을 확인 할 수 있다.
클로저가 호출 되지 않으면 영영 내부코드가 실행되지 않기 때문에 연산을 실행하지 않는다는 것을 확인 했다. 이는 연산 자원을 많이 소모한다거나 부작용이 우려되는 경우 유용하게 쓸 수 있을 것 같다. 라고 한다.
---
함수형식으로 전달한다고 하고 만들면 아래 예제 처럼 된다.
var customersInLine: [String] = ["YoangWha", "SanggGon", "SungHe", "Romi"]
print(customersInLine.count) // 4
func serveCustomer(_ customerProvider: () -> String) {
print("Now serving \(customerProvider())!")
}
serveCustomer({customersInLine.removeFirst() }) // "Now serving YoangWha"
print(customersInLine.count) // 3
serveCustomer( _ : ) 함수는 클로저를 매개변수로 전달받고 있다.
암시적 표현으로 인해서 위든 아래든 retrun 키워드를 생략할 수 있다.
var customersInLine: [String] = ["YoangWha", "SanggGon", "SungHe", "Romi"]
print(customersInLine.count) // 4
func serveCustomer(_ customerProvider: @autoclosure () -> String) {
print("Now serving \(customerProvider())!")
}
serveCustomer(customersInLine.removeFirst())
print(customersInLine.count)
복습이 필요할 것 같다.
어렵다 프로그래밍...
'프로그래밍 > Swift' 카테고리의 다른 글
옵셔널 이해하기 (복습) (0) | 2018.10.21 |
---|---|
클로저 탈출 (1) | 2018.10.17 |
클로저 값 획득 (복습) (0) | 2018.10.17 |