[TIL] 2024. 06. 17

2024. 6. 17. 21:38·TIL (Today I Learned)

함수와 클로저에 대한 설명

함수 (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
'TIL (Today I Learned)' 카테고리의 다른 글
  • [TIL] 2024. 06. 19
  • [TIL] 2024. 06. 18
  • [TIL] 2024. 06. 14
  • [TIL] 2024. 06. 13
DongDong_
DongDong_
  • DongDong_
    how-dev
    DongDong_
  • 전체
    오늘
    어제
    • 분류 전체보기 (102)
      • TIL (Today I Learned) (96)
      • DEV (0)
        • 알고리즘 (0)
        • SWIFT (0)
      • 사전캠프 데일리 미션 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글작성
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
DongDong_
[TIL] 2024. 06. 17
상단으로

티스토리툴바