(편의상 편한 말투로 작성하는 점 이해 부탁드립니다.😅)
(부정확한 정보가 있을 수 있습니다. 지적 환영🤩)
오늘은 Closure는 무엇인지에 대해 알아보도록 하겠습니다!
Closure는 Optional과 같이 Swift의 꽃이라고 볼 수 있습니다! 실제로 많이 사용하기도 하고 많은 편리함을 제공하기 때문이죠!
Closure의 정의는 코드에서 전달 및 사용할 수 있는 코드블럭입니다. 코드블럭? 함수가 코드블럭이었는데 그럼 함수랑 어떤 차이가 있는지 알아봐야겠죠?
사실 함수도 클로저의 일종입니다. 이게 무슨 말이냐구요? 클로저에는 크게 Nemed Closure와 Unnamed Closure가 있는데 여기서 Nemed Closure, 즉 이름이 있는 클로저를 함수라고 표현하고 Unnamed Closure, 즉 이름이 없는 클로저(익명함수)를 보통 클로저라고 표현합니다. 또한, 함수와 마찬가지로 일급객체의 역할을 할 수 있습니다.
일급객체란?
전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수 있다.
클로저는 Unnamed Closure라고 했죠? 함수와 사용방법은 같지만 이름만 없다고 생각하시면 좋을 것 같네요! 클로저에는 클로저 헤드와 바디가 존재하는데 이 둘을 구분하기 위해 사이에 in 키워드를 사용합니다.
{ (매개 변수) -> 리턴 타입 in // 클로저 헤드
실행 구문 // 클로저 바디
}
클로저에는 매개변수와 리턴이 있을 수도 없을 수도 있습니다. 실제로 어떻게 사용하는지 알아보도록 하죠!
매개변수와 리턴이 있는 클로저
아래와 같이 함수처럼 매개변수 이름과 타입, 리턴 타입을 명시하여 사용할 수 있고 아래처럼 클로저를 변수에 담아 사용할 수 있습니다.
let hello = { (name: String) -> String in
return "Hello, \(name)"
}
hello("woo") // Hello, woo
매개변수와 리턴이 없는 클로저
아래처럼 매개변수와 리턴 없이 클로저를 사용할 수 있습니다. 또한, 클로저 헤드에 있는 () -> () in 같은 부분을 생략할 수도 있습니다.
let hello = { () -> () in
print("hello")
}
hello()
클로저를 함수의 매개변수로 전달하는 예시
클로저는 일급객체이기 때문에 아래 코드처럼 함수의 매개변수로 전달할 수도 있습니다!
func doSomething(closure: () -> ()) {
closure()
}
doSomething ( closure: { () -> () in
print("hello")
})
클로저를 반환하는 함수 예시
func doSomething2() -> () -> () {
return { () -> () in
print("hello")
}
}
doSomething2()() // hello
후행클로저
후행클로저란 아래처럼 매개변수로 클로저를 사용하는 상황에 코드를 더 읽기 쉽도록 하는 방법입니다. 아래 코드에서 doSomething 함수를 호출하는 두 코드를 보겠습니다. 첫번째는 원래 방법대로 매개변수에 클로저를 할당하는 코드이고 두번째는 후행클로저를 사용한 코드입니다. 딱봐도 두번째 코드가 더 간결하여 읽고 이해하기 편한 것을 알 수 있죠?? 하지만 만약 매개변수로 전달하는 클로저가 두 개 이상이라면 마지막 클로저만 후행클로저로 전달 할 수 있습니다ㅠㅠㅠ
func doSomething(closure: () -> ()) {
closure()
}
doSomething ( closure: { () -> () in
print("hello")
})
doSomething {
print("hello")
}
클로저 단축 문법
클로저는 정말 다양한 방법으로 코드를 단축하여 사용할 수 있습니다. 하지만 너무 단축문법만을 사용하면 코드를 읽기는 쉬워지지만 이해하기 어려워질 수 있기 때문에 단축문법을 사용할 때는 항상 가독성 측면을 고려하여 사용하시는 것을 추천드립니다!
func doSomething3(closure: (Int, Int, Int) -> Int) {
closure(1,2,3)
}
doSomething3(closure: { (a, b, c) in
return a+b+c
})
doSomething3(closure: {
return $0+$1+$2
})
doSomething3(closure: {
$0+$1+$2
})
doSomething3() {
$0+$1+$2
}
doSomething3 {
$0+$1+$2
}
오늘은 Closure(클로저)에 대해 알아보았습니다. 사실 클로저는 굉장히 많이 사용하는 문법이기도 하고 내용도 방대하기 때문에 잘 이해하고 사용하는 것이 좋을 것 같습니다.
다음에는 고차함수에 대해 알아보도록 하겠습니다!!!
'Swift' 카테고리의 다른 글
[Swift] 고차함수란? (0) | 2023.06.23 |
---|---|
[Swift] 예외처리(try-catch) (0) | 2023.06.18 |
[Swift] Extension(익스텐션)이란? (0) | 2023.06.15 |
[Swift] Protocol(프로토콜)이란? (0) | 2023.06.13 |
[Swift] 열거형(Enumeration)이란? (0) | 2023.06.11 |