swift에서 제네릭을 사용하면 코드가 여러 가지 데이터 타입과 함께 작동할 수 있게 만든다.
제네릭을 사용하면 코드의 재사용성이 높아진다. 같은 코드를 여러 번 작성할 필요 없이 다양한 데이터 타입에 대해 같은 코드를 사용할 수 있게 해준다. 이를 통해 코드를 더 간단하고, 오류를 줄이며, 유지보수가 쉽게 만든다.
// 제네릭 함수를 정의한다.
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
// 이제 우리는 서로 다른 타입의 값을 교환할 수 있다.
var number1 = 10
var number2 = 20
swapValues(&number1, &number2)
print("number1: \(number1), number2: \(number2)") // 출력: number1: 20, number2: 10
var string1 = "Hello"
var string2 = "World"
swapValues(&string1, &string2)
print("string1: \(string1), string2: \(string2)") // 출력: string1: World, string2: Hello
위의 예제에서 swapValues
함수는 제네릭 함수다. T
는 어떤 타입이든 될 수 있는 일종의 '자리표'다. 이 함수는 두 개의 값을 받아서 서로 위치를 바꾼다. 그리고 우리는 숫자, 문자열 등 어떤 타입이든 사용할 수 있다.
여러 타입을 처리할 때: 만약 여러 타입의 데이터를 다루어야 한다면, 제네릭을 사용하여 같은 코드로 여러 타입을 처리할 수 있다.
코드의 재사용성을 높일 때: 같은 기능을 여러 번 구현하지 않고, 한 번의 구현으로 여러 타입에 대해 동작하게 하고 싶을 때 유용하다.
유지보수의 용이성: 코드가 중복되지 않아서, 수정이 필요할 때 한 곳만 고치면 되므로 유지보수가 쉽다.
장난감 상자 예제를 더 확장해보자. 이제 장난감을 담을 수 있는 상자를 만들어보자.
// 제네릭 클래스를 정의한다.
class ToyBox<T> {
var toys = [T]()
func addToy(_ toy: T) {
toys.append(toy)
}
func getToy(index: Int) -> T? {
if index < toys.count {
return toys[index]
} else {
return nil
}
}
}
// 인형 장난감 상자를 만든다.
let dollBox = ToyBox<String>()
dollBox.addToy("인형")
dollBox.addToy("곰인형")
print(dollBox.getToy(index: 0) ?? "없음") // 출력: 인형
// 숫자 장난감 상자를 만든다.
let numberBox = ToyBox<Int>()
numberBox.addToy(1)
numberBox.addToy(2)
print(numberBox.getToy(index: 1) ?? "없음") // 출력: 2
위의 예제에서 ToyBox
클래스는 제네릭 클래스다. T
는 어떤 타입이든 될 수 있는 자리표로, 이 상자에 어떤 타입의 장난감이든 담을 수 있다.