본문 바로가기
Swift

Closer에 관하여

by iOS 개린이 2023. 3. 1.

클로저

-클로저는 어떤 기능을 하는 코드를 블록으로 모아놓은 것을 말한다.

 

-우리가 아는 함수도 클로저에 포함되어 있는 개념이다.

클로저의 종류

Named Closure : 이름이 있는 클로저로 우리가 알고있는 함수를 말한다.(클로저이지만 우리에게 익숙한 함수로 불릴 뿐)

UnNamed Closure : 이름이 없는 클로저

지금 배우고자 하는 것은 이름이 없는 클로저이다.

 

 

 

기본 클로저 표현

-기본 클로저는 다음과 같이 표현한다.

 

클로저의 표현식은 클로저 헤드와 클로저 바디로 나누어진다.

1) 클로저 헤드 : { (매개변수 : 매개변수 타입) -> return 반환타입 

2) 클로저 바디 : //실행구문 }

 

클로저 중간에 있는 in 키워드는 헤드와 바디를 구분지어준다.

 

 

 

매개변수와 반환타입을 생략한 클로저

-매개변수와 반환타입을 생략한 클로저

 

closure라는 상수에 클로저를 대입할 때, (매개변수) -> (반환타입) 이 들어가야 할 자리를 생략할 수 있다.

 

 

매개변수와 반환타입이 존재하는 클로저

-매개변수와 반환타입이 들어가는 클로저

 

다음과 같이 표현할 때 주의할 점이 있다.

클로저는 Argument Label을 사용하지 않는다는 점이다.

위의 코드에서 name은 Argument Label이면서 Parameter Name이라고 생각할 수 있지만, 

클로저에서는 Argument Label은 사용되지 않기 때문에 다음과 같이 사용했을 때 오류가 발생한다.

 

ex) Argument Label을 사용한 클로저

 

 

 

매개변수로 전달하는 클로저

-함수의 매개변수로 클로저를 전달할 수 있다.

 

다음과 같이 함수를 매개변수로 받는 closure라는 함수를 선언했을 때,

클로저와 함수는 같기 때문에 매개변수 부분에 클로저를 대입해줄 수 있다.

 

 

위 코드와 같이 함수를 선언할 때 매개변수로 클로저를 넣고 실행해보면 

print("closure") 가 실행된다.

 

 

반환타입으로 사용되는 클로저

-클로저는 매개변수 뿐만 아니라 반환타입으로도 사용이 가능하다.

 

매개변수, 리턴타입으로 넣었던 클로저들을 보면 가독성이 매우 떨어진다.

클로저를 좀 더 쉽게 읽을 수 있도록 도와주는 후행 클로저에 대해서 알아보자.

 

 

 

후행 클로저 표현(Trailing Closure)

-함수의 마지막 매개변수가 클로저일 때, 후행 클로저를 사용할 수 있다.

 

 

매개변수가 클로저 하나일 때, 후행 클로저의 사용

-다음과 같이 매개변수가 하나이고, 매개변수의 타입이 클로저 형식일 때 

 

closure 함수를 실행시켜야 할 때, 원래대로라면 위 코드처럼

함수의 호출 구문 ( ) 안에 매개변수인 클로저를 넣어주어야 한다. 

 

후행 클로저를 사용하기 위해서는 마지막 매개변수가 클로저 형식이어야 하는 조건이 있었죠?

지금 조건이 적합하기 때문에 후행 클로저를 사용할 수 있다.

함수의 호출 구문인 ( ) 안에 클로저를 넣지 않고, Enter 키를 눌러주면 자동 완성으로  후행 클로저가 만들어진다.

 

 

위 코드를 보면 함수의 호출 구문인 ( ) 소괄호가 생략되고 꼬리부분에 { } 중괄호가 생겨난다.

이것이 바로 후행 클로저인 것이다.

 

 

 

매개변수가 여러 개일 때, 후행 클로저의 사용

 

-다음과 같이 매개변수가 여러 개인 함수를 선언했다.

 

여기서 마지막 매개변수가 클로저 형식일 때만 사용할 수 있는 후행 클로저를 사용하면? 

 

 

위 코드를 보면, 첫 번째 매개변수에는 소괄호 안에 클로저가 들어갔고, 

후행 클로저를 사용할 수 있는 마지막 매개변수에는 호출 구문 소괄호에서 벗어나 꼬리처럼 클로저를 할당해준다.

 

 

계속 간단해지는 클로저의 표현식

-계속해서 라이트해지는 클로저 표현식을 알아보자.

 

 

타입 유추를 통한 경량 표현

-다음과 같은 함수를 선언해주었을 때

 

이 함수를 사용하기 위해서는 함수에서 요구하는 매개변수와 리턴타입을 충족하는 클로저를 넣어주어야 한다.

 

이를 좀 더 라이트하게 표현해줄 수 있다.

매개변수 타입과, 리턴타입을 타입 유추 기능을 통해 생략이 가능한 것이다.

 

 

매개변수 타입과 리턴타입을 생략하니 좀 더 간결해진걸 볼 수 있다.

근데 이것보다 더 간결하게 만들어 줄 수 있는데, 바로 단축 인자 이름을 사용하는 것이다.

 

 

단축 인자 이름을 통한 경량 표현

-Swift에서는 매개변수의 이름을 생략할 수 있도록 단축 인자 이름이라는 기능을 제공해주는데, 

$와 index를 이용해서 매개변수에 접근할 수 있도록 해주는 것을 말한다.

 

-단축 인자 이름을 사용하면 클로저의 헤더와 바디를 구분해주었던 in 키워드도 생략이 가능해진다.

 

 

많이 경량화되었죠? 근데 여기서 한번 더 경량시킬 수 있어요~

 

 

암시적 반환 표현

-제목이 어려워보일 뿐 뜻은 리턴타입을 생략할 수 있다는 것이다.

클로저가 반환 값을 갖는 클로저이고, 클로저 바디의 실행 구문이 한 줄일 때 return 키워드 마저 생략이 가능하다.

 

 

위의 코드를 보면 현재 closure 함수의 매개변수가 클로저 형식 하나죠?

마지막 매개변수가 클로저 형식일 때는 후행 클로저가 가능하다.

 

 

이것이 계속해서 간단해지는 클로저 표현식의 최종본이다. 

주의할 점은 간단한 코드가 무조건적으로 좋은 코드가 아니라, 코드의 가독성이 상승하도록 적절하게 활용하는 것이 베스트다.

 

 

 

 

 

 

 

 

Reference :

-야곰님의 스위프트 문법 개정 3판

-https://babbab2.tistory.com/81

'Swift' 카테고리의 다른 글

고차함수에 관하여  (0) 2023.03.06
Closer에 관하여2  (0) 2023.03.02
연산자 정리  (0) 2023.02.28
열거형에 관하여 2  (0) 2023.02.17
열거형에 관하여  (0) 2023.02.15