내일배움캠프 7기 Day51 TIL (3)

Daisy Kim·2023년 9월 20일
0

제네릭(Generics) Part.1

타입에 의존하지 않는 범용 코드를 작성할 때 사용.
중복을 피하고, 코드를 유연하게 작성할 수 있게 한다.

공식문서

상황 예시

① 두 인자를 파라미터로 같은 Int타입 값을 받고, 그 둘을 swap 하는 함수를 만들고 싶다.

func swapTwoInts(_ a: inout Int, _ b: inout Int )
let tempA = a
a = b
b = tempA

② 파라미터가 모두 Int인 경우, 잘 동작함. 그러나 타입이 다르면 사용할 수가 없다. But, 나는 다른 타입을 인자로 받으면서 동일한 내용을 가진 함수를 사용하고 싶다?

// 예를 들어서 Double을 인자로 받고 싶은 경우:
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
   let tempA = a
   a = b
   b = tempA
}
// String을 인자로 받고 싶은 경우:
func swapTwoStrings(_ a: inout String, _ b: inout String) {
   let tempA = a
   a = b
   b = tempA
}

③ 아 같은 내용을 반복하기 번거롭다... 하면 😮‍💨

이럴때 쓰는 것이 바로 제네릭(Generics). 타입에 제한을 두지 않는 코드를 작성할 때 쓴다.

사용 방법

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
   let tempA = a
   a = b
   b = tempA
}

❗️여기에 사용된 이 T를 Type Parameter라고 부르는데 T라는 새로운 형식이 생성되는 것이 아니라,
실제 함수가 호출될 때 해당 매개변수의 타입으로 대체 되는 Placeholder이다.❗️

// 함수 호출 시 T는 Int 타입으로 결정됨
var firstInt = 1
var secondInt = 100
swapTwoValues(&firstInt,  &secondInt)          
 
// 함수 호출 시 T는 String 타입으로 결정됨 
var firstString = "Hello"
var secondString = "Good Bye"
swapTwoValues(&firstString, &secondString)

이런 식으로 실제 함수를 호출할 때, T의 타입이 결정된다.

profile
Technology proderit homini

0개의 댓글