🔥 타입 매개변수

314자
4분

Swift에서 제네릭을 사용할 때 타입 매개변수(Type Parameters)를 지정하여 타입에 대한 플레이스홀더 역할을 하도록 할 수 있습니다. 타입 매개변수를 사용하면 실제 타입을 모르는 상태에서도 코드를 작성할 수 있으며, 함수나 타입을 더욱 유연하고 재사용 가능하게 만들 수 있지요.

이전에 살펴 본 swapTwoValues(_:_:) 예제에서 사용된 T는 타입 매개변수의 좋은 예시입니다. 타입 매개변수는 함수 이름 바로 뒤, 꺾쇠 괄호(<>) 사이에 명시하며, 여러 개의 타입 매개변수를 쉼표로 구분하여 지정할 수도 있어요.

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    // T는 타입 매개변수로, 함수가 호출될 때 실제 타입으로 대체됩니다.
    let temporaryA = a
    a = b
    b = temporaryA
}
swift

타입 매개변수를 지정하고 나면 함수의 매개변수 타입이나 반환 타입, 함수 본문 내에서 타입 어노테이션 등에 해당 타입 매개변수를 사용할 수 있습니다. 함수가 호출될 때마다 타입 매개변수는 실제 타입으로 대체되지요.

위 예제에서 swapTwoValues(_:_:) 함수가 처음 호출되었을 때는 TInt로 대체되었고, 두 번째 호출 시에는 String으로 대체되었습니다.

var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
// someInt는 이제 107, anotherInt는 3
 
var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)
// someString은 이제 "world", anotherString은 "hello"
swift

이렇게 제네릭과 타입 매개변수를 활용하면 여러 타입에 대해 동작하는 함수나 타입을 만들 수 있어 코드의 재사용성과 표현력이 크게 향상됩니다. 실제 타입은 컴파일러가 타입 추론을 통해 결정하므로, 우리는 타입에 구애받지 않고 로직에 집중할 수 있게 되지요.

다음은 여러 타입 매개변수를 사용하는 예시 코드입니다:

func printTwoTypes<T, U>(_ a: T, _ b: U) {
    // 두 개의 타입 매개변수 T와 U를 사용합니다.
    print("첫 번째 인자 \(a)의 타입은 \(type(of: a))입니다.")
    print("두 번째 인자 \(b)의 타입은 \(type(of: b))입니다.")
}
 
printTwoTypes(3, "hello")
// 출력 결과:
// 첫 번째 인자 3의 타입은 Int입니다.
// 두 번째 인자 hello의 타입은 String입니다.
 
printTwoTypes("world", true)
// 출력 결과:
// 첫 번째 인자 world의 타입은 String입니다.
// 두 번째 인자 true의 타입은 Bool입니다.
swift

이처럼 여러 개의 타입 매개변수를 사용하면 실제 타입과 무관하게 다양한 조합의 인자를 받아 처리할 수 있는 함수를 만들 수 있답니다.