본문 바로가기

Swift 기초

Swift 제너릭 (Generic)

반응형

Swift 제너릭 (Generic)

자료형에 의존하지 않는 알고리즘만 작성된 함수 (C++에서는 Templete 함수라고 함!)

 

Swift 배열을 써봤다면 같은 자료형이 아니더라도 배열에 담기는 것을 알 수 있다.

Swift의 Array Library가 제너릭으로 작성되었기 때문이다.

 

그밖에도 Stack, Queue 등 자료형에 의존하지 않는 알고리즘을 필요로 하는 데에 제너릭이 사용된다.

(자료형에 의존한다면 똑같은 기능을 함에도 자료형별로 다 따로 선언해야함..-_-;;;)

 

ex)

사실 Swift에는 '튜플'을 이용하면 되므로 별도의 swap함수를 만들지 않아도 된다. ( var1 = (p1,p2), var2 = (p2, p1) )

제너릭 사용 예를 들기 위해 swap함수를 작성함.

func swapInt(a:inout T, b:inout T){
    let tmp = a
    a = b
    b = tmp
}

 

func swapDouble(a:inout Double, b:inout Double){
    let tmp = a
    a = b
    b = tmp
}

인자를 교환한다는 알고리즘은 동일함에도 매개변수의 자료형에 의존한다면 위 같은 함수들을 각각 만들어야함.

 

제너릭을 안쓸 경우 자료형별로 별도로 만들어야함.


여기서 제너릭을 사용하여 이러한 불편함 해소.

func 함수이름<T>(param1:T, para2:T) -> T{
내용
return 반환값
}

제너릭 함수 기본 형태를 설명하면 위와 같다.  함수이름 옆에 바로 <T>를 적음으로써 이 함수는 Generic으로 작성됐음을 알린다.

(구조체, 배열 등도 마찬가지로 이름 바로 다음에 <T>로 명시)

T타입실제 호출될 때마다 결정된다.

 

func swapTwo<T>(a:inout T, b:inout T){
    let tmp = a
    a = b
    b = tmp
}

간단하게 스왑으로 예를 들면 위 코드와 같다.

 

기능이 같고 자료형만 다를 경우 제너릭을 통해 통일 가능.

자료형별로 swapInt 함수와 swapDouble 함수를 각각 만들었을 때와 제너릭 함수 하나로 통일했을 때의 결과가 같다.

코드 간결성, 가독성 등의 이점을 모두 얻었다.

반응형

'Swift 기초' 카테고리의 다른 글

Swift 클로저(Closure)  (0) 2019.03.30
Swift 중첩함수  (0) 2019.03.28
Swift 함수 기초  (2) 2019.03.27
[Swift 기초] switch case 문  (0) 2019.03.16
[Swift 기초] while, repeat while 문  (0) 2019.03.16