티스토리 뷰

iOS/Swift

Swift - Generic의 개념

포도 동 2022. 2. 13. 14:14

오늘은 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
링크
«   2025/05   »
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
글 보관함