[Swift 기초] 제너릭

2022. 3. 11. 16:59Swift 기초 정리

728x90

//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎

 

1. 제너릭

func 함수명<타입형1, 타입형2>(_ 매개변수1: inout 타입형1, _ 매개변수2: inout 타입형2){
	/*함수 구현*/
}
  • 제네릭(generic): 어떤 호환 데이터 타입과도 동작할 수 있는 함수를 만들 수 있다.
    • 함수와 메서드를 선언할 때는 전달할 인자의 타입을 명시적으로 선언하면
    • → 같은 실행 코드지만 서로 다른 데이터 타입을 사용해야 할 때는 반복 작성이 불가피한 경우가 있다.
    • ⇒ 코드의 반복/ 중복 문제를 해결하고, 표현성을 향상해 준다.
  • 제너릭 타입은 자료형에 무관한 유연하면서도 재사용이 가능한 코딩을 할 수 있다.
  • Swift의 강력한 기능이며 Swift의 표준 라이브러리는 제너릭으로 구현되어 있다.
    • ex. Array, Dictionary
    • C++에서는 함수 템플릿이라고 함. template<class T>와 같이 선언하여 사용

1-1. 제너릭 필요성

  • 하나의 함수를 통해서 모든 종류의 자료형에 대한 알고리즘을 만들 수 있다.
  • inout 매개변수 중에서 함수 내에서 변경된 매개변수가 함수 호출이 종료된 시점에서도 계속 유지되기를 원한다면 inout 키워드 사용
    //swap 함수의 값이 Int, Double, String과 같이 다양하다.
    func swapTwoInts(a: inout Int, b: inout Int){
        let temporaryA = a
        a = b
        b = temporaryA
    }
    
    func swapTwoDoubles(a: inout Double, b: inout Double){
        let temporaryA = a
        a = b
        b = temporaryA
    }
    
    func swapTwoStrings(a: inout String, b: inout String){
        let temporaryA = a
        a = b
        b = temporaryA
    }
    
    var genericA = 100, genericB = 200
    var genericDA = 100.0, genericDB = 200.0
    var genericSA = "A", genericSB = "B"
    
    swapTwoInts(a: &genericA, b: &genericB)
    print("\(genericA) \(genericB)")             //200 100
    print("\(genericDA) \(genericDB)")           //200.0 100.0
    swapTwoStrings(a: &genericSA, b: &genericSB) 
    print("\(genericSA) \(genericSB)")           //B A
  • //제너릭을 사용하면 하나의 코드로 모두 사용할 수 있다.
    //매개변수는 다르지만 함수로직은 동일함 → 제너릭스를 이용하면 함수의 로직에 집중할 수 있다.
    func swapTwoValues<T>(a: inout T, b: inout T){
        let temporaryA = a
        a = b
        b = temporaryA
    }
    swapTwoValues(a: &genericA, b: &genericB)
    print("\\(genericA) \\(genericB)")           //100 200
    swapTwoValues(a: &genericDA, b: &genericDB)
    print("\\(genericDA) \\(genericDB)")         //100.0 200.0
    swapTwoValues(a: &genericSA, b: &genericSB)
    print("\\(genericSA) \\(genericSB)")         //A B

1-2. 제너릭 리턴값

  • 타입형은 실행 시에 결정된다.
  • func arrRepeat<ItemType>(item: ItemType, times: Int) -> [ItemType]{
        var result = [ItemType]()
        for i in 0..<times{
            result.append(item)
        }
        return result
    } 
    print(arrRepeat(item: "knock", times: 5))  //["knock", "knock", "knock", "knock", "knock"]
    print(arrRepeat(item: 1, times: 5))        //[1, 1, 1, 1, 1]

 

 

 

참고하였습니다. 감사합니다.

https://www.inflearn.com/course/창원대학교-박동규-교수의-swift-기초-강좌/lecture/1893?tab=curriculum 

23.07.11 수정) Swift 쉽게, 더 쉽게

https://www.yes24.com/Product/Goods/17652267

728x90