함수는 일급객체이다.
따라서 클로저도 일급객체이다.
일급객체(First-class citizen 또는 First-class object)란 프로그래밍 언어에서 다른 객체들과 동등한 지위를 가지는 객체를 의미한다.
그리고 일급객체이기 위한 다음과 같은 조건이 있다.
쉽게 외우는 법은 변소에 갔더니 파리!
1. 변: 변수에 할당 가능
let add: (Int, Int) -> Int = { (a, b) in
return a + b
}
2. 파: 함수를 파라미터로 전달 가능
func applyOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
let add: (Int, Int) -> Int = { (a, b) in
return a + b
}
let result = applyOperation(3, 5, operation: add) // 8
3. 리: 리턴(반환) 가능
func chooseOperation(_ choice: Int) -> (Int, Int) -> Int {
switch choice {
case 1:
return { (a, b) in a + b }
case 2:
return { (a, b) in a - b }
default:
return { (a, b) in a * b }
}
}
let operation = chooseOperation(1)
let result = operation(3, 5) // 8
클로저와 함수의 기능은 완전히 동일하지만 형태가다르다.
기능이 같다면 클로저를 사용하는 이유는 뭘까?
- 코드 중복을 줄일 수 있다.
클로저는 코드 중복을 줄이는 데 사용 가능 예를 들어, 반복적인 작업을 수행하는 함수가 있을 때, 클로저를 사용하여 코드를 중복 방지 - 함수 인자로 사용
Swift에서 함수는 일급 객체이므로 함수 인자로 전달할 수 있음 클로저는 함수 인자로 전달되어 함수가 실행될 때 동작을 정의 가능
- 비동기 처리를 위해 사용
예를 들어, 비동기적으로 데이터를 가져오는 함수를 호출할 때, 클로저를 사용하여 데이터가 가져와졌을 때 실행할 코드를 정의 - 간단한 코드 블록을 만들 수 있음
예를 들어, 애니메이션을 만들 때, 클로저를 사용하여 애니메이션이 시작될 때와 종료될 때 실행할 코드를 정의 가능 - 함수 내부에서 코드를 정의
내부에서 사용할 수 있는 코드 블록을 생성하여 함수의 범위를 제한할 수 있음 이렇게 하면 함수 외부에서 클로저를 호출할 수 없으므로 코드를 보다 안전하게 사용 가능
클로저의 기본형태
// 함수: func + 함수명(파라미터) -> 리턴타입 {코드}
func dog(name:String) -> String {
return "귀여운 \(name)"
}
var name01 = dog
name01("동글이")
// 귀여운동글이
//클로저 {(파라미터) -> 리턴타입 in 코드}
let dog1 = {(name:String) -> String in
return "매우 귀여운 \(name)"
}
var name02 = dog1
name02("방글이")
//매우귀여운방글이
클로저의 형태
클로저는 크게 4가지 형태로 표현이 가능함
일반적인 함수의 형태
func funcb(a: Int, b:Int) -> Int {
let result = a + b
return result
}
//1. 일반적인 클로저 형태
let _ = {(a:Int, b:Int) -> Int in
let result = a + b
return result
}
//2. 타입을 명시한 뒤 할당하는 형태
let _ : (Int,Int) -> Int = {(a, b) in
let result = a + b
return result
}
// 3. 타입추론형태
// +, -, * 등은 같은 타입으로만 가능함 따라서, plus + "4"는 같은 String 타입으로,
// plus + 4 는 Int 타입으로 컴파일러가 추론
let c = {(plus) in
return plus + 4
}
let cString = {(plus) in
return plus + "4"
}
//4.void형태
let _ = {
print("")
}
'🍎swift' 카테고리의 다른 글
[Swift] 연산자 커스텀 타입 (0) | 2023.04.05 |
---|---|
Swift - 문자열 다루기 01 (0) | 2023.03.29 |
swift - 제네릭(Generics) (0) | 2023.03.22 |
메모리 관리 (0) | 2023.03.12 |
고차함수 (0) | 2023.03.07 |