문법 (18) 제네릭 (Generics)
Swift에서 제네릭 (Generics)의 개념과 활용법을 설명합니다.
문법 (18) 제네릭 (Generics)
제네릭 (Generics)
Swift의 제네릭(Generics) 은 유연하고 재사용 가능한 코드를 작성할 수 있도록 도와주는 기능입니다.
제네릭을 활용하면 데이터 타입에 의존하지 않는 코드를 만들 수 있습니다.
1. 제네릭 함수 사용
제네릭 함수는 특정 데이터 타입에 관계없이 유형을 추론하여 사용할 수 있도록 설계됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
var x = 10, y = 20
swapValues(&x, &y)
print(x, y) // 20 10
var str1 = "Hello", str2 = "Swift"
swapValues(&str1, &str2)
print(str1, str2) // Swift Hello
T는 제네릭 타입을 나타내며, 호출 시점에 결정됨
2. 제네릭 타입 (Generic Type)
제네릭을 활용하여 유연한 데이터 구조를 만들 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Stack<T> {
private var elements: [T] = []
mutating func push(_ item: T) {
elements.append(item)
}
mutating func pop() -> T? {
return elements.popLast()
}
}
var intStack = Stack<Int>()
intStack.push(5)
intStack.push(10)
print(intStack.pop()) // 10
3. 제네릭과 프로토콜 (associatedtype)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protocol Container {
associatedtype Item
mutating func addItem(_ item: Item)
}
struct Box<T>: Container {
typealias Item = T
private var items: [T] = []
mutating func addItem(_ item: T) {
items.append(item)
}
}
var box = Box<String>()
box.addItem("Swift")
associatedtype을 사용하면 프로토콜 내에서 유동적인 타입을 적용할 수 있음
4. 제네릭 제약 (where 절 활용)
제네릭에 특정 제약 조건을 추가할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
func findIndex<T: Equatable>(of value: T, in array: [T]) -> Int? {
for (index, element) in array.enumerated() {
if element == value {
return index
}
}
return nil
}
let numbers = [10, 20, 30, 40]
print(findIndex(of: 30, in: numbers) ?? "Not found") // 2
T: Equatable을 통해T타입이 Equatable 프로토콜을 준수해야 함을 명시
5. 제네릭 확장 활용
1
2
3
4
5
6
7
8
9
extension Stack {
func peek() -> T? {
return elements.last
}
}
var stringStack = Stack<String>()
stringStack.push("Swift")
print(stringStack.peek()) // Swift
제네릭을 활용하면 유연한 데이터 구조와 타입 안전성을 동시에 유지할 수 있습니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.