[iOS / Swift] Swift 문법을 알아보자! - 14편 : 클로저 (Closure)

프린스송·2021년 7월 4일
4

Swift 문법

목록 보기
14/21
post-thumbnail
post-custom-banner

안녕하세요~~ 오늘은 스위프트에서의 클로저에 대해서 알아보겠습니다. 단어만 들으면 생소할 수 있지만 다른 언어를 접해보신 분들은 이것의 역할이 조금은 익숙할 수 있을 것 같다는 생각이 드네요. 그럼 좀 더 자세히 알아보겠습니다.


클로저 (Closure)

클로저는 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호"{}" 구분된 코드의 블럭입니다. 쉽게 말하면 클로저는 이름이 없는 함수입니다. 따라서 함수는 이름이 있는 클로저라고 할 수 있겠죠! 클로저를 사용한다면 따로 함수를 만들어야 할 불편함 없이 즉석에서 함수를 만들 수 있습니다.

스위프트의 클로저와 같은 것들

  • C, C++, Objective-C 의 block
  • Java의 Lambda funtion
  • C#의 Delegates

위에서 제가 다른 언어를 접해보신 분들은 클로저의 의미를 쉽게 알 수 있을 거라고 했는데 다른 언어에서도 같은 기능을 하는 것들이 많이 있습니다.

클로저의 표현

클로저의 표현은 다음과 같습니다.

{ (매개변수 이름 : 매개변수 타입) -> 반환타입 in 
	클로저 표현식 코드
}

함수와 굉장히 비슷한 형태를 띄고 있습니다. 가장 큰 차이점은 이름이 있냐 없냐 입니다. 클로저에서는 함수처럼 이름이 없습니다. 인자들을 넣을 수 있고 반환타입까지 설정을 해줄 수 있습니다. 그리고 함수의 내용에 해당하는 수행 내용을 in 다음에 적습니다. 보통의 함수와 같은 기능을 하지만 문법에서 아주 조금의 차이를 보이고 있네요. 그럼 간단한 코드를 작성해서 더 자세히 알아보도록 하죠.

  • 일반적인 함수
func add(x:Int, y:Int) -> Int {
    return (x+y)
}

print(add(x:10, y:20))

add 함수를 하나 만들었습니다. 이 함수는 두개의 인자를 받으며 두 인자의 합을 반환합니다.

  • 클로저
let add1 = {(x:Int, y:Int) -> Int in
    return(x+y)
}
print(add1(10,20))

이번에는 클로저 입니다. 위의 일반적인 함수와 기능은 똑같지만 클로저로 표현을 했습니다. add 상수에 함수를 넣어주는 느낌으로 표현할 수 있습니다.


후행 클로저 (trailing closure)

후행 클로저란 클로저가 함수의 마지막 argument라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있게 해주는 것입니다. 클로저에 여러 줄 표현(실행 코드)가 들어가게 된다면 가독성을 위해 사용하는 것이 좋다고 합니다. 코드를 작성해보겠습니다.

//후행 클로저 미사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default, handler: {
    //실행 코드
})

//후행 클로저 사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default) {
    //실행 코드
})

첫번째 코드는 후행 클로저를 사용하지 않은 코드입니다. UIAlertAction에 인자가 3개가 있고 마지막 매개변수의 이름을 생략하고 후행 클로저를 사용할 수 있습니다.


클로저의 축약 표현들

배열을 정렬해주는 클로저 하나를 만들었습니다.

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

let reversed = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})
print(reversed)
  • 타입 생략
    클로저는 메서드에서 요구하는 형태로 전달해야 합니다. 그래서 스위프트에서는 이러한 문맥을 이용해 타입을 유추할 수 있다고 합니다. 그래서 매개변수의 타입이나 반환 타입을 생략해서 클로저를 사용할 수 있게 됩니다.
let reversed = names.sorted(by: { (s1, s2) in
    return s1 > s2
})
print(reversed)
  • return 생략
    클로저에서는 return도 생략을 할 수 있습니다.
let reversed = names.sorted(by: { (s1, s2) in
   	s1 > s2
})
print(reversed)
  • 매개변수 생략
    클로저에서는 매개변수의 이름도 생략을 할 수 있습니다. 매개변수의 이름을 명시하지 않아도 $와 숫자의 조합으로 단축 인자 이름을 사용할 수 있습니다. $0이 첫번째 매개변수가 되고 $2는 두번째 매개변수가 됩니다. 'in' 키워드도 생략이 됩니다.
let reversed = names.sorted(by: {
    return $0 > $1
})
print(reversed)
  • 연산자만 표기
    클로저는 매개변수의 타입과 반환 타입이 연산자를 구현한 함수의 모양과 동일하다면, 연산자만 표기하더라도 알아서 연산하고 반환하여 줍니다.
let reversed = names.sorted(by: >)
print(reversed)

오늘은 클로저에 대해 공부를 했습니다. 클로저의 축약도 아직 헷갈리고 많이 사용해 보지 않은 문법이라 조금의 숙력이 필요할 것 같습니다. 구글링과 유튜브를 통해 많은 공부를 했고 더 찾아보면서 많이 사용을 해봐야 될 것 같네요! 그럼 오늘도 수고 많으셨습니다.
참고 자료 :
smile han 유튜브
장국진 블로그
devAxe 블로그

profile
[iOS / Swift] [React Native]
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 7월 31일

포스팅보고 많은 공부가 되었습니다. 공부하다가 찾은 부분인데 후행 클로저 파트에서 예시로 보여주신 후행 클로저 사용에 ")"가 잘못 입력되어 있습니다. 수정해주시면 다른 사람이 보실 때 편할 것 같아서 말씀드립니다. 감사합니다!

답글 달기