Swift
Swift) Generic 제네릭
나태한개발
2024. 6. 5. 10:01
뭔가 메서드를 만들다 보면 타입에 영향을 너무 많이 받는거 같다.
그러다 보면 같은 기능이지만 매개변수 타입만 달라서 메서드를 분리하는 경우가 생기는거 같다.
그래서 찾아보던중 제네릭이라는 것이 있길래 조금 정리해 보려고 한다.
내가 어디서 본거 같다 했더니 전에 map함수 볼때 봤었다.
제네릭 함수
제네릭은 코드의 유연성과 재사용성을 높이기 위해 사용되는 기능이다. 제네릭을 사용하면 함수, 구조체, 열거형, 클래스 등을 작성할 때 데이터 타입에 의존하지 않고, 특정 타입을 지정하지 않으면서도 다양한 타입을 다룰 수 있다.
예제로 봅시다.
func swapTwoValues<T>(_ a: T, _ b: T) -> (T, T) { //넣은값 서로 교환
return (b, a)
}
//Int형
var x: Int = 5
var y: Int = 10
let swapped = swapTwoValues(x, y)
print("x: \(swapped.0), y: \(swapped.1)") // x: 10, y: 5
//String형
var str1: String = "첫번째"
var str2: String = "두번쨰"
let swappedStr = swapTwoValues(str1, str2)
print("str1: \(swappedStr.0), str2: \(swappedStr.1)") // str1: 두번째, str2: 첫번째
더 간단한 함수를 만들고 싶었는데
제네릭 함수에서 선언한 T 타입파라미터는 우리가 기본적으로 사용하는 Int, String 타입에 채택된 프로토콜조차 채택되지 않고 깡통타입이라 연산자 같은것을 사용해 주려면 따로 프로토콜을 채택 해줘야한다.
func flus<T: AdditiveArithmetic>(_ a: T, _ b: T) -> T {
return a + b
}
print(flus(3, 4)) //7
AdditiveArithmetic은 더하기 연산을 담당하는 프로토콜이다.
저걸 채택 해주지 않으면 오류가 난다.
func flus<R: AdditiveArithmetic>(_ a: R, _ b: R) -> R {
return a + b
}
print(flus(3, 4)) //7
T라고 안하고 그냥 아무거나 지어도 된다.
제네릭 타입
제네릭은 구조체, 클래스, 열거형 타입에도 사용할수 있다.
이걸 제네릭 타입이라고 한다.
struct Stack<T> {
private var items: [T] = []
mutating func push(_ item: T) {
items.append(item)
}
mutating func pop() -> T? {
return items.popLast()
}
}
var intStack = Stack<Int>() //Int 스택으로 초기화
스택을 만들때 사용하면 좋다.
초기화 할때 타입을 명시해 주면 된다.
간단하게 사용할수 있을정도로 기초 개념을 정리 했다.
모든 문법개념이 그렇듯 파면 끝도 없이 나올거 같다.
나중에 추가적으로 알게 된게 있으면 적도록 하겠다.