클로저(Closure)
💡 클로저(Closure)
- 1급 객체 함수로, 다른 함수와 메서드의 인자로 전달하거나 함수나 메서드에서 반환값으로 사용할 수 있음
- 코드 블록으로서 변수나 상수를 캡처하여 저장할 수 있으며, 필요한 경우 나중에 호출할 수 있음
- 보통 이름 없는 익명 함수로 알려져 있으나, func 키워드를 통해 이름을 붙인 함수들도 클로저의 종류
클로저의 형식
전역 함수(Global Functions)
이름이 있고 어떤 값도 캡처하지 않는 클로저
→ 전역 함수는 전역 범위에서 정의되며, 함수와 비슷한 구문으로 작성된다.
중첩 함수(Nested Functions)
이름이 있고 둘러싸는 함수에서 값을 캡처할 수 있는 클로저
→ 중첩 함수는 다른 함수 내에 정의되어 있으며, 해당 함수의 스코프 내에서만 사용된다.
클로저 표현식(Closure Expressions)
주변 컨텍스트(혹, Scope)에서 값을 캡처할 수 있는 이름 없는 클로저
→ 클로저 표현식은 간결하게 작성할 수 있으며, 다른 함수의 인자로 전달하거나 반환값으로 사용될 수 있다.
클로저 형식의 차이점
형식 | 이름 | 값 캡처 여부 | 사용법 |
전역 함수 | 이름 있음 | 아니오 | { (parameters) -> ReturnType in ... } |
중첩 함수 | 이름 있음 | 예 | { (parameters) -> ReturnType in ... } |
클로저 표현식 | 이름 없음 | 예 | { (parameters) -> ReturnType in ... } |
클로저 표현식(Closure Expressions)
{ (parameters) -> <return type> in
// 실행 구문
}
Closure(클로저) Head
(parameters) -> </return type>
→ 클로저의 매개변수 및 반환 유형을 정의(반환 유형은 필요에 따라 생략)
Closure(클로저) Body
실행 구문
→ 실행되는 코드 블록으로, 클로저의 동작을 정의
Closure Head와 Closure Body를 이워주는 키워드
in
→ 클로저의 매개변수 및 반환 유형 정의와 실행 코드 블록을 분리하는 역할
클로저(Closure)를 변수처럼 정의
let hello: (String, String) -> String = { $1 + $0 + "님 안녕하세요!" }
hello("로저", "클")
클로저(Closure)를 옵셔널로 정의
let hello: ((String, String) -> String)?
hello?("로저", "클")
※ 옵셔널 체이닝도 가능
클로저(Closure)를 파라미터로 받기
func manipulate(number: Int, using block: Int -> Int) -> Int {
return block(number)
}
manipulate(number: 10, using: { (number: Int) -> Int in
return number * 2
})
클로저(Closure)를 사용한 sort() & filter()
let numbers = [1, 3, 2, 6, 7, 5, 8, 4]
let sortedNumbers = numbers.sort { $0 < $1 }
print(sortedNumbers) // [1, 2, 3, 4, 5, 6, 7, 8]
let evens = numbers.filter { $0 % 2 == 0 }
print(evens) // [2, 6, 8, 4]
Tip : 함수는 곧 클로저이기 때문에 연산자는 클로저다. 1 + 2를 실행하면, +라는 이름을 가진 연산자 함수가 실행된다. 파라미터로는 1과 2가 넘겨지게 되며 즉, + 함수는 파라미터 두 개를 받아서 합을 반환하는 클로저다. 그렇기 때문에, 아래 예시와 같이 +라는 연산자를 클로저로 넘겨버리는 문법도 가능해진다.
arr1.reduce(0, +) // 28
' 𝗔𝗣𝗣𝗟𝗘 > SWIFT : GRAMMAR' 카테고리의 다른 글
Swift 기초 문법 - 예외 처리(Exception Handling) (0) | 2024.03.13 |
---|---|
Swift 기초 문법 - 고차함수(higher-order function) (0) | 2024.03.13 |
Swift 기초 문법 - 접근 제한자(access control) (2) | 2024.03.12 |
Swift 기초 문법 - 타입 캐스팅(Type Casting) (0) | 2024.03.12 |
Swift 기초 문법 - 프로퍼티 옵저버 (0) | 2024.03.12 |