스파르타 코딩 클럽 - iOS 스타터 6기/본 캠프
11. 스파르타 코딩 클럽 - 클로저 (Closure)
seongpil Heo
2025. 3. 12. 21:18
🛠️ 클로저 Closure
- 익명 함수라고 불리는 클로저는 함수와 유사하게 특정 작업을 수행하는 코드 블록 입니다.
- 함수의 4가지 요소 (이름, 파라미터, 반환타입, 구현부)에서 이름을 제외한 파라미터, 반환타입, 구현부로 구성되어 있습니다.
- 데이터 타입으로 클로저를 사용할 수 있습니다
- 변수에 할당항 재사용할 수 있습니다.
- 함수의 파라미터로 전달할 수 있습니다.
- 코드의 재사용성을 높이고, 비동기 처리, 컬렉션 연산 등의 장점이 있습니다.
- 클로저가 함수 안에 포함된 것이 아니라 클로저 안에 함수가 포함되어 있습니다.
1️⃣ 타입으로 사용하는 방법
// 타입으로 사용할 때 표현 방법
(파라미터 데이터 타입) -> 리턴 타입
- 파라미터의 타입은 없을 때 비워두고, 리턴 타입이 없는 경우 Void라고 명시합니다.
- 파라미터가 없을 때도 () 괄호는 있어야 합니다!
- 데이터 타입으로 사용할 수 있기 때문에 Optional 타입으로 사용할 수 있습니다.
- 이때 전체를 ()로 감싼 후 ?를 입력해야 합니다
let closure: (Int, String) -> Void // 파라미터는 튜플(Int, String) 타입이고
// 반환타입은 없습니다.
// 만약 -> Void가 생략되었다면 튜플과 같죠!?
let closure2: (Int) -> Void // 파라미터는 1개로 Int이며 반환타입은 없습니다.
let closure3: () -> Void // 파라미터는 없고 반환타입도 없습니다.
// 파라미터는 ()로 감싸고 있어서 Void를 생략할 수 있어요.
let closure4: (Int) -> Int // 파라미터는 1개이고 Int 타입이며, 반환값은 Int 입니다.
let closure5: (String, Int) -> Int // 파라미터는 튜플(String, Int) 타입이고
// 반환타입은 Int입니다.
let optionalClosure: ((Int) -> Int)? // 옵셔널 타입입니다.
// 만약 ()가 없었다면 리턴값이 Int? 라고 판단됩니다!
2️⃣ 클로저 구현하는 방법
- 클로저는 익명함수 이므로, 구현할 때 in 키워드를 사용하여 파라미터와 구현부를 구분해야 합니다.
// 기본적인 구현 방법
// 중괄호로 시작하고 파라미터와 구현부 부분을 in 키워드를 사용하여 나눕니다.
{ 파라미터 이름 in
// 구현부
// 리턴
}
- in 키워드를 사용하여 앞에는 파라미터 이름을 뒤에는 구현부를 분리하여 작성합니다.
- 파라미터 이름은 생략 가능하며 0번째 파라미터 $0 으로 사용할 수 있습니다. ($0, $1, $2 ...)
- 파라미터가 없다면 in을 생략해야 합니다.
- 파라미터 이름은 사용하실 이름을 자유롭게 작성하면 됩니다.
let closure: (Int, String) -> Void = {intValue, stringValue in
print(intValue)
print(stringValue)
}
let closure2: (Int) -> Void = {
print($0)
}
let closure3: -> Void = {
print("Hello")
}
let closure4: (Int) -> Int = { value in
return value * 2
}
let closure5: (String, Int) -> Int = {
ruturn $0.count + $1
}
let optinalClosure: ((Int) -> Int)? = { value in
return value * 2
}
let emptyParameterClosure: () -> Void = {
print("World")
}
3️⃣ 클로저 사용(호출)하는 방법
- 클로저를 변수나 상수에 저장했다면 함수처럼 이름 뒤에 괄호를 사용하면 됩니다.
- 옵셔널 변수에 저장한 클로저는 변수이름?() 형식으로 사용하면 됩니다.
- 구현하고 즉시 호출한 결과값을 저장하고 싶다면 {} 뒤에 괄호 ()를 사용하면 됩니다.
// 변수에 저장한 클로저 호출
let closure: (Int, String) -> Void = { intValue, stringValue in
print(intValue)
print(stringValue)
}
closure(10, "20")
/* 출력 값
10
20
*/
let optionalClosure: ((Int) -> Int)? = {
return $0 * 2
}
print(optionalClosure?(10)) // 옵셔널 상수 optionalClosure의 클로저를 호출합니다.
// 상수의 타입이 optional이기 때문에 결과값이 Optional로 나옵니다.
/* 출력 값
Optional(20)
*/
// 구현하고 바로 호출
// 클로저를 구현하고 바로 실행하여 결과값을 helloClosure 상수에 할당합니다.
let helloClosure = {
return "안녕하세요! 구현하자마자 바로 실행해보겠습니다!"
} ()
print(helloClosure) // 안녕하세요! 구현하자마자 바로 실행해보겠습니다!
4️⃣ 실습하기
- 1. 아래 조건에 맞는 기본 클로저를 만들어보세요
- minusClosure 상수의 타입은 (Int, Int) -> Int 입니다.
- 클로저 구현부는 두개의 Int값을 받아서 뺀 뒤 반환합니다.
- minusClosure 상수를 호출해보세요.
let minusClosure: (Int, Int) -> Int = { firstNum, secondNum in
return firstNum - secondNum
}
print(minusClosure(10, 5))
- 1번에서 만든 클로저에 파라미터 이름을 생략해보세요.
let minusClosure: (Int, Int) -> Int = {
return $0 - $1
}
print(minusClosure(10, 5))