
C++의 Template과 비슷한 개념인 Swift의 Generics는 재사용 가능한 함수와 타입의 코드를 작성할 수 있게 해줍니다!
재사용 가능한 함수와 타입??
예시를 한번 들어볼게요ㅎㅎ
어떤 변수의 값을 교환하는 Swap 함수를 만들면 이렇게나 간단합니다.
func swap(a: inout Int, b: inout Int) {
let temp = a
a = b
b = temp
}
근데 여기에 3.5와 4.2를 가진 값을 교환하는 Swap 함수를 사용하고 싶으면 어떻게 해야할까요?
이렇게 Double 형을 매개변수로 받는 함수를 새로 만들어줘야 합니다.
func swap(a: inout Double, b: inout Double) {
let temp = a
a = b
b = temp
}
그렇다면 String은요??
String 값을 교환해주는 함수를 또 새로 만들어야 할까요?
이렇게 get이 가능한 어떤 타입을 단순히 바꿔주는 함수들을 타입에 따라서 함수들을 새로 만든다는 것은 엄청나게 소모적이죠.
Generics를 쓰면 다음과 같이 표현할 수 있습니다.
func swap<T>(a: inout T, b: inout T) {
let temp = a
a = b
b = temp
}
여기서 T는 type parameter(타입 매개변수)라고 합니다.
T를 그냥 "임의의 타입이 들어올 공간의 이름"이라고 생각하시면 됩니다!
이 공간의 이름은 우리가 이름 붙여주기에 나름입니다ㅎㅎ
이렇게 T 대신 Something이라고 이름붙였습니다.
상황에 알맞은 이름을 붙이면, 훨씬 유지보수가 간편하겠죠?
func swap<Something>(a: inout Something , b: inout Something) {
let temp = a
a = b
b = temp
}
이렇게 만들어진 공간에는 특정한 제약을 걸어주지 않은 이상 어떤 타입이든 들어올 수 있습니다.
이 제약에 대해서는 다음 글에서 작성해볼게요!