티스토리 뷰
오늘은 Swift Generic의 개념과 기본적인 활용법에 대해 정리해보겠습니다.
문서에 따르면 'Generic을 사용하면 정의한 요구 사항에 따라 모든 유형에서 작동할 수 있는 유연하고 재사용 가능한 함수 및 유형을 작성할 수 있습니다. 중복을 피하고 그 의도를 명확하고 추상적인 방식으로 표현하는 코드를 작성할 수 있습니다.' 라고 정의되어 있습니다.
그리고 Swift의 가장 강력한 기능 중 하나이고, Swift 표준 라이브러리의 대부분은 Generic으로 만들어졌다고 합니다.
우리가 인지하지 못한 부분에서도 제네릭을 사용하고 있는데, 예를 들어 Swift의 Array, Dictionary 유형은 모두 Generic Collection이라고 합니다.
아래와 같이 제네릭을 활용하지 않고 두 Int 변수를 교환하는 함수가 있을때,
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
이 함수는 in-out 매개변수를 이용해 Int변수 a와 b의 값을 교환하는 기능을 수행합니다.
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
이 함수는 두 변수의 값을 바꿀 때 유용하지만, Int값에만 사용할 수 있습니다. 만약 String 값 또는 Double 값을 교환하려면 아래와 같이 swapTwoStrings 및 swapTwoDoubles 함수와 같은 더 많은 함수를 만들어야 합니다.
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
}
위 함수들(swapTwoStrings, swapTwoDoubles)과 swapTwoInts의 기능은 동일하고 허용하는 자료형에만 차이가 있습니다.
이런 상황에선, 모든 자료형의 두 값을 교환하는 함수 1개만을 만드는 것이 더 유용하고 유연합니다. 그리고 이런 상황에서 바로 Generic을 활용할 수 있습니다!
Generic을 사용하면 아래와 같이
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
모든 자료형에서 동작하는 swapTwoValues함수를 작성할 수 있습니다.
swapTwoValues와 swapTwoInts 함수의 본문은 같지만, 첫번째 줄에서 약간의 차이가 있습니다. 아래 코드를 보면,
func swapTwoInts(_ a: inout Int, _ b: inout Int)
func swapTwoValues<T>(_ a: inout T, _ b: inout T)
Generic을 사용한 함수는 실제 자료형의 이름 대신 자리 표시자 유형의 이름 ( 이 경우 T라고 부름)을 사용합니다. 자리 표시자는 T가 어떤 자료형인지에 대해 말하지 않지만, T로 표현된 값 (위 함수에서 a와b)은 모두 동일한 자료형이여야 합니다.
그리고 T대신 실제 자료형은 swapTwoValues함수가 호출될 때마다 결정됩니다.
Generic함수와 Generic이 아닌 함수(non-Generic)의 차이점은, Generic함수는 함수의 이름 다음에 <>(꺽쇠 괄호)를 사용해 자리 표시자 유형의 이름(T)이 온다는 것입니다. 괄호(<>)는 T가 함수 정의 내의 자리 표시자 유형 이름임을 Swift에게 알려주고, T는 자리 표시자 이기때문에 Swift는 T라는 실제 자료형을 찾지 않습니다.
swapTwoValues함수는 swapTwoInts 함수와 같은 방식으로 호출될 수 있습니다. 단, swapTwoValues는 a와 b 두 값이 서로 같은 자료형인 유형인 경우에만 전달할 수 있다는 차이가 있습니다. swapTwoValues가 호출될 때마다 T에 사용할 유형은 함수에 전달된 값의 자료형에서 유추됩니다.
아래의 두 가지 예에서 T는 각각 Int형과 String형으로 유추됩니다.
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
// someInt is now 107, and anotherInt is now 3
var someString = "Hello"
var anotherString = "World"
swapTwoValues(&someString, &anotherString)
//someString is now "World", and anotherString is now "Hello"
참고: https://docs.swift.org/swift-book/LanguageGuide/Generics.html
'iOS > Swift' 카테고리의 다른 글
Swift - Map / Filter / Reduce (0) | 2022.02.13 |
---|---|
Swift - protocol (0) | 2021.04.25 |
Swift 문법 (11) - 클로저 (Closure) 고급 (0) | 2020.12.13 |
Swift 문법 (10) - 클로저 (Closure) (0) | 2020.12.09 |
Swift 문법 (9) - 열거형 (0) | 2020.12.08 |
- Total
- Today
- Yesterday
- cocoapods
- Reactivex
- blendshape
- rxswift
- 코코아팟
- SWEA
- ARKit
- 카카오인턴십
- GraphDB
- 안드로이드
- Lottie
- Neo4j
- C++
- blendshapes
- ios
- 백준
- rxswift6
- 백준온라인저지
- infallible
- mergesort
- coreml
- boj
- 알고리즘
- Swift
- SwiftUI
- Kotlin
- 프로그래머스
- disposeBag
- DispatchQueue
- bounds
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |