[swift] 제네릭 데이터 타입과 관련된 Swift의 기능

제네릭(generic)은 Swift에서 매우 강력하고 유용한 기능 중 하나입니다. 제네릭은 코드의 재사용성을 높이고 타입 안정성을 보장하는 데 도움을 주는 도구로서, 컬렉션 타입과 함수에서 주로 사용됩니다.

제네릭 타입

제네릭 타입은 실제 타입이 아니라 임의의 타입을 가리키는 데 사용됩니다. 예를 들어, 배열은 여러 가지 타입의 요소를 저장할 수 있도록 제네릭으로 구현되어 있습니다.

var intArray: Array<Int> = [1, 2, 3]
var stringArray: Array<String> = ["Hello", "World"]

위의 예제에서 Array<Int>Int 타입의 요소를 저장하는 배열을 의미하고, Array<String>String 타입의 요소를 저장하는 배열을 의미합니다. 제네릭을 사용함으로써, 코드의 재사용성과 타입 안정성을 확보할 수 있습니다.

제네릭 함수

함수는 제네릭을 사용하여 다양한 타입의 인자와 반환 값을 처리할 수 있습니다. 아래는 제네릭 함수의 예시입니다.

func printArray<T>(array: Array<T>) {
    for element in array {
        print(element)
    }
}

위의 함수는 Array 형태의 인자를 받아서 해당 배열의 요소들을 출력하는 역할을 합니다. T는 임의의 타입을 나타내고, 함수를 호출할 때 실제 타입으로 대체됩니다.

let intArray: Array<Int> = [1, 2, 3]
let stringArray: Array<String> = ["Hello", "World"]

printArray(array: intArray)  // 1 2 3 출력
printArray(array: stringArray)  // Hello World 출력

위의 예시에서 printArray 함수는 intArraystringArray 두 가지 경우에 대해 각각 호출되었습니다. 제네릭 함수를 사용하면 하나의 함수로 여러 종류의 타입을 처리할 수 있으므로, 코드의 중복을 줄일 수 있습니다.

제네릭 제약조건

제네릭을 사용할 때 모든 타입에 대해 동일한 동작을 보장할 필요가 없을 수 있습니다. 이러한 경우에는 제네릭 타입을 제약조건을 추가하여 특정 타입에 대해서만 동작하도록 할 수 있습니다.

func processArray<T: Numeric>(array: Array<T>) {
    var sum: T = 0
    for element in array {
        sum += element
    }
    print(sum)
}

위의 예제에서 processArray 함수는 Numeric 프로토콜을 구현하는 타입에 대해서만 동작합니다. 따라서 Int, Float, Double과 같이 숫자 타입들에 대해서만 호출할 수 있습니다.

let intArray: Array<Int> = [1, 2, 3]
let stringArray: Array<String> = ["Hello", "World"]

processArray(array: intArray)  // 6 출력
processArray(array: stringArray)  // 오류 발생! String은 Numeric 프로토콜을 구현하지 않음

위의 예시에서 processArray 함수는 정수 타입의 배열에 대해 요소들의 합을 구하는 역할을 합니다. 제네릭 제약조건을 사용하여 숫자 타입에만 적용되도록 제한함으로써, 코드의 안정성을 확보할 수 있습니다.

결론

Swift의 제네릭 기능은 코드의 재사용성과 타입 안정성을 높이는 데 큰 도움을 줍니다. 제네릭 타입과 제네릭 함수를 적절히 활용하여 유연하고 안정적인 코드를 작성해보세요.

더 자세한 내용은 Swift 공식 문서를 참고해주세요.