개발하는 동글 :]

[TIL],[Swift],[Generics(제네릭) 공부해 보기!][0] 본문

카테고리 없음

[TIL],[Swift],[Generics(제네릭) 공부해 보기!][0]

동글하다 2023. 9. 19. 00:24

1. Generics(제네릭)이 해결하는 문제!

먼저 간단한 예시를 통해 알아보자!
var num1 = 1
var num2 = 2
위와 같이 두 개의 변수가 있고 두 변수를 교환하는 함수를 작성해 보자.
var doubleNum1 = 1.1
var doubleNum2 = 1.2

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let tempA = a
    a = b
    b = tempA
}
swapTwoInts(&num1, &num2)

func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
    let tempA = a
    a = b
    b = tempA
}
swapTwoInts(&num1, &num2)
swapTwoDoubles(&doubleNum1, &doubleNum2)
그렇다면 위와 같이 메모리 주소값을 넘겨 서로를 교환하는 함수를 구현할 수 있다.
그런데 Int값이 아닌 Double값 혹은 다른 타입의 두 변수를 교환하고 싶다면
모든 타입에 대응하는 함수를 만들어줘야만 한다는 불편함이 있다.
이러한 문제를 해결해 줄 수 있는 문법이 제네릭이라 생각한다.

2. Generics 함수를 사용해 보자!

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {  
    let tempA = a
    a = b
    b = tempA
}
이렇게 타입 파라미터 T를 받아 모든 타입에 대응하는 유연한 함수를 구현할 수 있다.

3. 클래스, 구조체에서의 Generics

 클래스, 구조체, 열거형의 타입이름 뒤에 타입 파라미터 <T>를 추가하면, 제네릭 타입으로 선언이 된다.

그렇다면 구조체 및 클래스에서 Generics을 사용하는 예시를 보자
struct Test<T>{
    var subject: [T] = []
}

var test1 = Test(subject: [1,2,3,4,5])
var test2 = Test(subject: ["수학","과학","국어","영어"])
구조체의 타입 파라미터를 추가했기에 Test란 구조체어서 과목을 숫자와 문자열 배열로 받을 수 있다.
class PhoneNumber<T>{
    var contacts:[T]
    init (contacts:[T]){
        self.contacts = contacts
    }
}

var contacts1 = PhoneNumber(contacts: [01011112222,01012345678])
var contacts2 = PhoneNumber(contacts: ["철수","민수"])
위의 클래스 또 한 타입 파라미터를 추가했기에 다양한 타입을 요소로 받을 수 있다.

4. TIL

4.1오늘의 회고

1. 오늘 과제 코드를 정리해 보며 viewModel 중 하나가 메모리에서 해제되지 않는 문제가 발생하였다.

2. 제네릭에 대한 이해가 부족했던 부분이 오늘 다른 분의 코드를 읽으면서 확실히 느끼게 되었다 그래서 제네릭이 무엇이며 어떻게 활용할 수 있는가에 대하여 정리를 하였다.

4.2 내일의 목표

1. 과제에서 메모리에서 해제되지 않는 viewmodel이 왜 메모리에서 해제되지 않는 것인지 이해하고 그것을 정리해 보자.

2. Generics을 실제로 활용하는 코드를 공부해 보자

 

5. Reference

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/generics/#app-top