제네릭(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
함수는 intArray
와 stringArray
두 가지 경우에 대해 각각 호출되었습니다. 제네릭 함수를 사용하면 하나의 함수로 여러 종류의 타입을 처리할 수 있으므로, 코드의 중복을 줄일 수 있습니다.
제네릭 제약조건
제네릭을 사용할 때 모든 타입에 대해 동일한 동작을 보장할 필요가 없을 수 있습니다. 이러한 경우에는 제네릭 타입을 제약조건을 추가하여 특정 타입에 대해서만 동작하도록 할 수 있습니다.
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 공식 문서를 참고해주세요.