반응형
closure란?= 이름이 없는 메소드 (사전 뜻은 폐쇄)
ex) ok 버튼을 눌렀을 때 수행해야 하는 코드 블록
1. 클로저는 두 가지로 이루어진 객체입니다. / 하나는 내부 함수이며, 또 다른 하나는 내부 함수가 만들어진 주변 환경입니다.
2. 클로저는 외부 함수 내에서 내부 함수를 반환하고, 내부 함수가 외부 함수의 지역 변수나 상수를 참조할 때 만들어집니다.
즉 클로저란, 내부 함수와 내부 함수에 영향을 미치는 주변 환경을 모두 포함한 '객체'입니다.
무슨 말인지 모르겠으니 예제를 통해 알아보도록 하겠습니다.
Closure의 표현식은 다음과 같습니다.
{ (매개변수) -> 반환 타입 in 실행할 구문}
1. 두 개의 수를 곱하는 Closure을 만들어 보겠습니다.
위 표현식에 따라 어디가 Closure함수인지 보면
(a: Int, b: Int) -> Int 가 (매개변수) -> 반환타입
in return a * b가 실행 구문입니다.
즉 a, b를 Int타입으로 변환받고, a * b를 수행하여 반환하라는 의미 입니다.
2. Closure의 축약형
위 코드와 같이 축약 가능한데, 무엇이 축약 되었나 살펴보면
(a: Int, b: Int) -> Int // 매게 변수 생략
in 삭제
return a * b가 {$0 * $1}
// 컴파일러가 반환 타입도 추론할 수 있으므로 return 값도 생략 가능합니다.
// 매개변수가 생략됐기 때문에 생략된 매개변수 명 대신 입력받은 인자값을 표시해 주기 위해 $0, $1로 대체
3. 지나친 생략은 자제..하도록 합시다.
코드를 구별하고, 파악하기 쉽게 하기 위해서 최소한의 것만 생략하는 것을 추천합니다.
{ 매개변수 in 실행 구문}
4. 두 매개변수를 받아 Closure를 통해 두 매개변수가 곱해지는 '함수'를 만들어 보겠습니다.
파라미터, 파라미터, 클로져 형태
1단계 Closure 작성
var multiply: (Int, Int) -> Int { a, b in
return a * b}
2단계 함수에 Closure 연결
func operationTwoNum(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int{
let result = operation(a, b)
return result
}
3단계 기능 수행 (기능수행을 클로져가 할 수 있도록)
operationTwoNum(a: 4, b: 2, operation: multiply) // 1단계에서 만든 multiply Closure
5. Closure는 즉흥해서 바로 식을 작성할 수도 있습니다.
operateTwonum(a: 4, b: 2) // 이후 즉흥적인 클로져 메이킹
{ a, b in return a / b}
6. input도 outputeh도 없는 Closure
input () // 없다
output Void // 없다.
Closure {print("ios 개발자가 되자")}
7. Capturing Value
Closure에 잡힌 Constant는 스콥 내외 가리지 않고 Captured 됐다고 표현한다.
먼저 스콥에 대한 이해를 해보겠습니다.
안쪽 스콥{}에서는 바깥쪽 스콥{} 변수에 대한 접근이 가능합니다
반면
바깥쪽 스콥{}에서는 안쪽 스콥{} 변수에 대한 접근이 불가능 합니다.
반면에 Capturing Value (= Closure에 묶인 Constant)는 스콥{} 바깥에서도 자유롭게 사용 가능합니다.
Captured Constant by Closure = count
{count += 1}
count가 스콥 바깥에서도 사용되고 출력되는 것을 위 사진으로 볼 수 있습니다.
반응형
'iOS > Swift 문법' 카테고리의 다른 글
[Swift] Networking, Concurrency(동시성) (0) | 2022.03.23 |
---|---|
[Swift] D11, Closure 심화 (0) | 2022.03.08 |
[Swift] D10-2 Set (0) | 2022.03.05 |
[Swift] 10-1 Dictionary (0) | 2022.03.05 |
[Swift]9-2, Array (0) | 2022.03.05 |