본문 바로가기
iOS/Swift

[Swift] 클로저 (Closures) 란?

by 뚱이 2022. 1. 19.

안녕하세요 ^_^ 

이번 포스팅은 Swift의 핵심이라고 생각되는 " 클로저 " 를 주제로 글을 작성해보도록 하겠습니다.

 

 

클로저 (Closure)

클로저는 Named Closure , Unnamed Closure 두 가지 형태로 존재합니다.

 

Named Closure

 

Named Closure의 경우에는  클로저의 이름이 정해진  형태로써 흔히 함수라고 불립니다. 

 

UNNamed Closure

UNNamed Closure의 경우에는  이름이 없는 함수라고 생각하시면 돼요.

클로저 표현 문법 (Closure Expressions)

{ (parameters) -> return type in
      statements
}

클로저의 표현식은 크게 두 부분으로 나눠서 설명할 수 있을 거 같아요.

 

          : 인자를 넣을 parameters 와 리턴 타입

          : 인자 값을 이용해서 처리할 내용을 기술하는 부분

 

그리고  in 키워드를 통해서 두 부분을 구분하게 해준다고 이해하시면 될 거 같아요.

아래 예시로 다시한번 리마인드 해봅시다!

 

여기서 보시면 

 

1. exampleClosure 함수의 setName 인자에 클로저를  넣어줍니다.

2. exampleClosure 함수가 호출됐을 때 setName의 인자로 "LEE"를 넘겨주는 구문을 추가해줍니다.

3. exampleClosure 함수를 호출하고 setName 클로저를 작성해줍니다.

   - pameters : (a:String)

   - return type : String

   - statement: return

 

이런식으로 클로저를 표현할 수 있습니다.

 

그런데 클로저 내부가 굉장히 길죠? 뭔가 짧게 줄이고 싶은 욕구가 생기지 않으신가요??

 

네! 제가 한번 해보겠습니다!!

 

1. 문맥에서 타입 추론 (Inferring Type From Context)

위 예제에서 클로저는 exampleClosure(setName:)의 메소드에서 이미 (String) -> String 타입의 인자가 들어와야 하는지 알기 때문에 클로저에서 이 타입들은 생략 될 수 있습니다. 
 
제목에서 알 수 있듯이 메소드의 입장에서는 내가 String 타입으로 정해뒀으니까 당연히 String 타입이 들어오겠지라고 생각한다고 볼 수 있죠!
 
그럼 바로 적용을 해보죠!

 

짠 어때요??  굉장히 심플해졌죠???

 

2. 단일 표현 클로저에서의 암시적 반환 (Implicit Returns from Single-Express Closures)

제목이 참 어렵지만! 아주 간단합니다.

 

클로저의 문법 표현을 보시면 Statement를 정의하는 부분이 있었죠? 그 Statement 부분에 어떠한 로직이 들어가지 않고 단순하게 return 키워드만 존재한다면 return 키워드를 굳이 안 써도 된다!! 이말이죵

 

그럼 바로 적용을 해보죠!

어때요? 더 깔끔해졌죠????

 

3. 인자 이름 축약 (Shorthand Arguments Names)

 인자 이름 축약은 인자를 네이밍 하는 게 아니고 인자의 순서대로 $0, $1, $2... 이런 식으로 대체하는 거예요.

 

아래 예시로 한번 확인해보죠!

예시를 보면 현재 클로저 내부에 num1, num2라는 인자를 받고 있죠?? 요놈들을 $0, $1로 바꿔서 표현하는 거예요

짠!! 인자 이름 축약은 저도 굉장히 애용하고 있어요! 참 좋은 녀석이죠!

 

 

 


클로저는 포스팅 하나로 마무리 지으려고 했는데 쉽게 안되네요 ㅠㅠ

다음 포스팅에서는 Escaping Closures , Autoclosures, 그리고 Caption Values에 대해서 설명드리겠습니다.

긴 글 읽어주셔서 감사드려요 다음 포스팅에서 봐요~~