[swift] 클로저와 제네릭(Generic) 사용

클로저와 제네릭은 Swift 언어에서 매우 강력하고 유용한 기능입니다. 이들을 적절히 활용하면 코드의 재사용성을 높이고, 타입 안정성을 강화할 수 있습니다.

클로저(Closures) 개요

클로저란, 일정 기능을 수행하는 코드 블록을 의미합니다. 함수와 마찬가지로 입력값을 받아서 결과값을 반환할 수 있습니다. 클로저는 다음과 같이 선언할 수 있습니다.

let closureName: (InputType) -> ReturnType = { (input) -> ReturnType in
    // 클로저의 기능 구현
    return returnValue
}

예를 들어, 정수를 입력받아 제곱값을 반환하는 클로저는 다음과 같이 작성할 수 있습니다.

let square: (Int) -> Int = { (num) -> Int in
    return num * num
}

클로저는 변수에 할당하거나, 함수의 인자로 전달하거나, 함수의 반환값으로 사용될 수 있습니다.

제네릭(Generic) 개요

제네릭은 Swift에서 함수나 타입을 일반화하는 기능을 제공합니다. 이는 다양한 타입에 대해 재사용 가능한 코드를 작성할 수 있게 해줍니다. 제네릭은 다음과 같이 선언할 수 있습니다.

func functionName<T>(arg1: T, arg2: T) {
    // 제네릭 함수의 내용
}

T는 임의의 타입을 나타내는 식별자로, 함수 내에서 사용될 타입을 지정할 때 사용됩니다. 예를 들어, 배열의 요소를 표시하는 제네릭 함수는 다음과 같습니다.

func printElements<T>(array: [T]) {
    for element in array {
        print(element)
    }
}

클로저와 제네릭의 함께 사용 예시

클로저와 제네릭을 함께 사용하면 재사용 가능한 코드를 작성할 수 있습니다. 예를 들어, 배열의 각 요소에 지정된 클로저를 적용하여 새로운 배열을 반환하는 함수는 다음과 같이 작성할 수 있습니다.

func applyClosureToElements<T>(array: [T], closure: (T) -> T) -> [T] {
    var result = [T]()
    for element in array {
        result.append(closure(element))
    }
    return result
}

위의 함수는 입력으로 배열과 클로저를 받아서, 배열의 각 요소에 클로저를 적용하여 처리한 결과를 새로운 배열로 반환합니다. 다음은 이 함수를 활용한 예시입니다.

let numbers = [1, 2, 3, 4, 5]
let doubledNumbers = applyClosureToElements(array: numbers) { (num) -> Int in
    return num * 2
}
print(doubledNumbers) // [2, 4, 6, 8, 10]

위의 예시에서는 입력으로 Int 타입의 배열과 Int 타입을 반환하는 클로저를 전달하였습니다. 따라서 클로저는 각 요소에 2를 곱하는 기능을 수행하고, 결과로 새로운 Int 타입의 배열이 반환됩니다.

클로저와 제네릭은 Swift에서 코드를 간결하게 작성하고, 유연성을 확보하는 데 매우 유용한 기능입니다. 적재적소에 활용하여 코드의 재사용성을 높여보세요.

참고 자료