Swift에서 Closure를 사용하는 방법 총정리

Swift에서 클로저(Closure)의 정의, 문법, 고차 함수 활용 및 메모리 관리 방법을 알아보세요


Swift에서 Closure를 사용하는 방법 총정리

Swift에서 Closure 란?

Swift에서 Closure는 함수와 비슷한 개념이지만, 함수와 달리 이름이 없는 익명 함수입니다. 클로저는 코드 블록을 캡슐화하고 함수 내부에서 사용할 수 있습니다.

Swift에서 Closure 정의하는 방법

let closure = { (param: Int) -> Int in
    return param * 2
}
 
print(closure(10))
 
// 20

위 코드는 매개변수 param을 받아 2를 곱한 값을 반환하는 클로저를 정의한 것입니다. 클로저는 함수와 마찬가지로 매개변수를 받고 반환값을 정의할 수 있습니다.

클로저의 종류

클로저는 다음과 같은 종류로 나뉩니다.

  • 전역 함수: 이름이 있는 전역 변수에 할당된 클로저
  • 중첩 함수: 함수 내부에 정의된 클로저

전역 함수

전역 함수는 이름이 있는 전역 변수에 할당된 클로저입니다. 전역 함수는 함수 내부에 정의된 클로저와 달리 함수 외부에서 정의됩니다.

let globalClosure = { (param: Int) -> Int in
    return param * 2
}
 
print(globalClosure(10))
 
// 20

중첩 함수

중첩 함수는 함수 내부에 정의된 클로저입니다. 중첩 함수는 함수 내부에 정의되며, 함수 외부에서 정의할 수 없습니다.

func outerFunction() -> Int {
    let localClosure = { (param: Int) -> Int in
        return param * 2
    }
    return localClosure(10)
}
 
print(outerFunction())
 
// 20

클로저의 약식 인수 이름

클로저의 약식 인수 이름은 클로저 내부에서 매개변수를 참조하는 방법입니다. 약식 인수 이름은 매개변수 이름을 생략하고 사용할 수 있습니다.

let concat = { (string1: String, string2: String) -> String in
    return string1 + string2
}
 
print(concat("Hello", " World"))
 
// Hello World
 
// 위 표현은 아래와 같이 약식 인수 이름을 사용할 수 있습니다.
let concat: (String, String) -> String = {
     $0 + $1
}
print(concat("Hello", " World"))
 
// Hello World

단일 표현식에서 return 키워드를 생략되었고, in 키워드도 생략되었습니다.

클로저를 사용하는 고차 함수 예제

Swift의 배열에서 흔히 사용하는 map, filter, reduce 함수는 클로저를 사용하여 배열을 처리합니다.

let numbers = [1, 2, 3, 4, 5]
let doubledNumbers = numbers.map { $0 * 2 }
print(doubledNumbers)
 
// [2, 4, 6, 8, 10]
let numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)
 
// [2, 4]
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum)
 
// 15