Write code that works for multiple types and specify requirements for those types.
여러 타입에 대해서 요구사항을 정하여 코드가 동작하게 도와준다.
Generic 코드는 정의한 요구사항에 어떠한 타입이라도 동작할 수 있는 유연하고 재활용성이 높은 함수나 타입을 작성하게 해준다.
🔑 key: 타입에 제한되지 않는 타입이나 함수 작성 가능 → 유연성 up! 재활용성 up!
swapTwoInts
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
이렇게 swapTwoInts 기능은 유용하지만 단점 존재 → Int 타입에 한정해서 사용 가능
String, Double 타입에 대해서 swap 기능을 사용하려면 두 타입을 파라미터로 받는 함수를 새로 정의할 필요
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
}
이처럼, 타입(형식)에 관계없이 한번의 구현으로 모든 타입을 처리하여 유연한(유지보수 쉽고, 재사용성 높은) 함수 / 구조체 / 클래스 / 열거형 등을 일반화 가능한 코드로 작성 가능
func swapTwoValues<T, U>함수 이름을 작성한 뒤 ‘< >’를 작성하고 안에 타입 파라미터 작성
func swapTwoValues<T>(_ a: inout T, _ b: inout T)
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}