iOS/Swift 문법

[Swift]D10-3 Closure

Chafle 2022. 3. 6. 00:24
반응형

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