안녕하세요, 루피입니다.
오늘은 클로저에 대해 공부하고 정리해 보겠습니다. 바로 시작하겠습니다.
1. 클로저란?
클로저는 코드 블록으로 특정 작업을 수행하는 기능을 캡슐화한 것입니다.
클로저는 함수와 유사한데요, 사실은 함수 역시 클로저의 일부분입니다. 무슨 말인지 바로 말씀드리겠습니다.
클로저는 크게 named closure과 unnamed closure로 나뉘는데요.
- named closure : 우리가 흔히 부르는 함수
- unnamed closure : 우리가 흔히 부르는 클로저
이름이 나뉘는 데는 이유가 있겠죠?? 사용 목적이 다르기 때문입니다.
named closure는 반복하여 사용할 수 있는 코드블록으로 이때, 강조되는 부분은 반복이라는 부분입니다.
반복적으로 호출하기 위해서는 명확한 이름을 가지고 명확한 역할을 하는 게 좋겠죠?
예시를 들어보겠습니다.
func greet(name: String) -> String {
return "Hello, \(name)!"
}
let message = greet(name: "Luffy") // "Hello, Luffy!"
unnamed closure는 코드블록을 다른 곳으로 전달하는데 포커스가 되어있습니다.
다른 함수에 전달하거나, 변수에 저장하여 사용되며, 간단한 작업을 수행하거나 일회성으로 사용되는 경우가 많습니다.
예시를 들어보겠습니다.
let greet = { (name: String) -> String in
return "Hello, \(name)!"
}
let message = greet("Luffy") // "Hello, Luffy!"
2. 함수를 클로저 형식으로 바꿔보기
좀 더 이해를 돕고자 코드를 통해 알아보도록 하겠습니다.
// 원래 함수의 모습
func sayHello() {
print("Hello")
}
// func 을 제거한다
sayHello() {
print("Hello")
}
// 이름을 제거한다.
(){
print("Hello")
}
// brace를 앞으로 옮긴다.
{ ()
print("Hello")
}
// 파라미터 다음에 in keyword 를 집어 넣는다.
{ () in
print("Hello")
}
// 지금은 파라미터와 리턴형이 없으니깐 지워도 됩니다.
// 클로저 표현식은 글로벌 스코프에서 단독으로 사용할수 없기에 컴파일 에러가 발생한다.
{ print("Hello") } // 가장 심플한 형태의 클로저 (Closure Expression)
// 이름이 없어 부를수 없기에 상수 안에 넣어준다. 그리고 호출한다.
let c = { print("Hello") }
c()
잘 이해되시나요? 이해가 되셨다면 오케이입니다. 그러면 하나의 궁금증이 들 거라고 생각합니다...
앵??? 상수에 코드 블록을 저장할 수 있다고????
네 가능합니다. 왜냐하면 함수는 일급 객체 이거든요!!
코드를 통해 한 번 더 예시를 들어 보겠습니다.
// 이때 () -> () 에서 두 괄호는 다른 의미를 가지고 있습니다.
// 처음으로 나오는 ()는 파라미터가 비어있다는 것을 의미합니다.
// 그리고 두번째로 나오는 ()는 리턴형이 없다는 void를 의미합니다.
func excute(codeBlock: () -> ()) {
codeBlock()
}
// print() 부분에서 출력되는 것이 아니라 클로저를 excute의 파라미터 값으로 넘겨주고,
// excute가 그 값을 codeBlock() 으로 실행 시키는겁니다.
// () <- 실행이라는 의미를 가지고 있죠?
excute(codeBlock: { print("HI")}) // HI
// 설명 : 상수에 클로저를 저장하는 함수이다.
let arithmeticFunction = { (a: Int, b: Int) -> Int in
return a + b
}
/*
클로저에는 argument 레이블을 전달하지 않아도 됩니다.
오히려 같이 전달하면 에러가 나기 때문입니다..
*/
arithmeticFunction(1,2) // 3
오늘도 화이팅 입니다.
'iOS > Swift' 카테고리의 다른 글
| [Swift] 함수형 프로그래밍(Functional Programming) 1/2 (1) | 2025.01.13 |
|---|---|
| [Swift] 클로저(Closure) 2/2 (0) | 2025.01.13 |
| [Swift] 접근 제어자 (Access Control) (0) | 2025.01.12 |
| [Swift] Set (0) | 2025.01.05 |
| [Swift] Array (0) | 2025.01.05 |