제네릭을 사용하지 않는 전통적인 방식에서는, 특정 타입의 값만을 교환할 수 있는 함수를 여러 개 만들어야 한다.
여러 데이터 타입을 스왑할 수 있는 함수를 만드는 경우를 예시로 들어보자.
이 때 우리는, 정수형(Int) 값을 교환하는 함수, 문자열(String) 값을 교환하는 함수, 그리고 실수형(Double) 값을 교환하는 함수 등이 필요하다..
이런 방식은 코드 중복을 발생시키고, 유지보수를 어렵게 만든다.
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
이 함수는 inout 매개변수를 사용하여 a와 b의 값을 교환한다.
만약 문자열이나 실수형 값을 교환하고 싶다면, 각각의 타입에 맞는 비슷한 함수를 또 만들어야 한다.
func swapTwoStrings(_ a: inout String, _ b: inout String) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
let temporaryA = a
a = b
b = temporaryA
}
이렇게 타입마다 별도의 함수를 만드는 것은 비효율적이다.
함수의 본문은 모두 똑같지만, 다루는 타입만 다르기 때문이다.
이럴 때 제네릭을 사용하는 것이다.
스위프트에서 제네릭을 사용하면, 다양한 타입에 대해 동작하는 단일 함수를 작성할 수 있다.
즉, 어떤 타입의 값이든 교환할 수 있는 하나의 범용적인 함수를 만들 수 있다.
이를 통해 코드를 훨씬 더 유연하고 재사용 가능하게 만들어 준다.
제네릭 함수 사용 예시
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
여기서 <T>는 제네릭 타입 플레이스홀더를 나타낸다.
이 함수는 어떤 특정한 타입(Int, String, Double 등)에 국한되지 않고, 모든 타입에 대해 작동할 수 있다!