함수와 클로저에 대한 설명
함수 (Function)
- 정의 : 함수를 통해 특정 작업을 수행하는 코드 블록입니다. 함수를 정의하고 호출하여 코드의 재사용성을 높일 수 있습니다.
- 형태 :
func greet(name: String) -> String {
return "Hello, \(name)!"
}
클로저 (Closure)
- 정의 : 코드에서 전달 및 사용할 수 있는 독립적인 코드 블록입니다. 클로저는 함수와 유사하지만, 몇 가지 중요한 차이점이 있습니다.
- 형태 :
let greetClosure: (String) -> String = { name in
return "Hello, \(name)!"
}
함수와 클로저의 차이점 비교표
특징 | 함수 (Function) | 클로저 (Closure) |
선언 방법 | `func` 키워드를 사용하여 선언 | `{ }`를 사용하여 선언 |
이름 유무 | 이름이 반드시 있어야 함 | 이름이 없을 수도 있음 (익명 클로저) |
캡처링 | 함수 내에서는 외부 변수를 캡처하지 않음 | 외부 변수를 캡처할 수 있음 |
반복 사용 | 정의된 함수 이름으로 여러 곳에서 호출 가능 | 필요 시에 바로 사용할 수 있음 (인라인 사용) |
함수 타입 | `func`로 명시된 타입 | 클로저 타입 `(인자 타입) -> (반환 타입)` |
인라인 사용 | 인라인 사용 불가능 | 인라인 사용 가능 |
Self 참조 | 클래스 메서드 내에서 `self` 필요 | 캡처리스트를 통해 `self` 참조 가능 |
축약된 형태 제공 | 제공되지 않음 | 축약된 형태 제공 (예: 매개변수 및 반환 생략) |
예제 코드 비교
함수 예제
func add(a: Int, b: Int) -> Int {
return a + b
}
let sum = add(a: 3, b: 5)
print(sum) // 8
클로저 예제
let addClosure: (Int, Int) -> Int = { (a, b) in
return a + b
}
let sumClosure = addClosure(3, 5)
print(sumClosure) // 8
요약
- 함수는 명명된 코드 블록이며, 명시적인 형태로 사용됩니다.
- 클로저는 코드 블록으로, 익명일 수 있으며, 인라인으로 사용되거나 전달되어 특정 상황에서 실행될 수 있습니다.
함수 대신 클로저를 사용할 때의 장점
클로저는 함수와 비교하여 다음과 같은 몇 가지 장점을 제공합니다:
1. 인라인 정의 및 사용
- 장점 : 클로저는 코드 내에서 바로 정의되고 사용할 수 있기 때문에 코드가 더 간결해지고 읽기 쉬워집니다.
- 예시 : 콜백 함수나 일회성으로 사용되는 코드 블록에 유리합니다.
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
// 클로저를 사용하여 배열의 각 요소를 두 배로 만듭니다.
2. 외부 변수 캡처
- 장점 : 클로저는 정의된 범위의 변수와 상수를 캡처하여 사용할 수 있습니다. 이로 인해 코드 블록 외부의 상태를 변경하거나 참조할 수 있습니다.
- 예시 :
func makeIncrementer(incrementAmount: Int) -> () -> Int {
var total = 0
let incrementer: () -> Int = {
total += incrementAmount
return total
}
return incrementer
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo()) // 2
print(incrementByTwo()) // 4
3. 축약된 구문
- 장점 : 클로저는 매개변수와 반환 타입을 생략하여 간결하게 작성할 수 있습니다.
- 예시 :
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
// 매개변수 및 반환 타입 생략 가능
4. 비동기 작업에서 콜백으로 사용
- 장점 : 클로저는 비동기 작업에서 콜백으로 자주 사용됩니다. 이를 통해 비동기 작업 완료 시 특정 코드를 실행할 수 있습니다.
- 예시 :
func performAsyncTask(completion: @escaping () -> Void) {
DispatchQueue.global().async {
// 비동기 작업 수행
completion() // 작업 완료 후 클로저 호출
}
}
performAsyncTask {
print("비동기 작업 완료!")
}
5. 함수형 프로그래밍 지원
- 장점 : 클로저는 Swift의 함수형 프로그래밍 패턴을 지원합니다. map, filter, reduce 등의 고차 함수에서 클로저를 사용하여 직관적이고 간결한 코드를 작성할 수 있습니다.
- 예시 :
let numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
// 짝수만 필터링
let sum = numbers.reduce(0) { $0 + $1 }
// 모든 요소를 합산
요약
클로저는 다음과 같은 상황에서 장점을 가집니다:
- 코드의 간결함과 가독성을 높이고자 할 때
- 외부 변수나 상수를 캡처하여 사용해야 할 때
- 비동기 작업에서 콜백으로 사용할 때
- 함수형 프로그래밍 패턴을 사용할 때
따라서, 클로저는 코드 작성의 유연성과 효율성을 높이는데 도움이 됩니다. 그러나 큰 규모의 복잡한 작업이나 여러 번 호출될 필요가 있는 경우에는 명확성과 재사용성을 위해 함수를 사용하는 것이 좋습니다.
반응형
'TIL (Today I Learned)' 카테고리의 다른 글
[TIL] 2024. 06. 19 (0) | 2024.06.19 |
---|---|
[TIL] 2024. 06. 18 (0) | 2024.06.18 |
[TIL] 2024. 06. 14 (0) | 2024.06.14 |
[TIL] 2024. 06. 13 (0) | 2024.06.13 |
[TIL] 2024. 06. 12 (0) | 2024.06.13 |