🔥 타입 매개변수

314자
4분

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

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

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

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

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

swift
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
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
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입니다.

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

YouTube 영상

채널 보기
쌍대곱, 코프로덕트 | 프로그래머를 위한 카테고리 이론
합타입 - Either, Maybe, List | 프로그래머를 위한 카테고리 이론
NestJS 모듈 시스템 기초와 구조 | NestJS 가이드
Haskell로 배우는 Writer 모나드 | 클라이슬리 카테고리 마지막편 | 프로그래머를 위한 카테고리 이론
생성자 지옥에서 벗어나는 DI 방법 | NestJS 가이드
NestJS 미들웨어 기초 - 클래스 기반 미들웨어와 DI | NestJS 가이드
피처 모듈은 무엇이고 왜 필요할까? | NestJS 가이드
모듈과 프로바이더 | NestJS 가이드