TIL(Today I Learned)

Generic이란?

  • 타입에 의존하지 않는 범용 코드를 작성할 때 사용
  • 중복을 피하고, 유연한 코드 작성 가능
  • Swift 표준 라이브러리의 대다수는 제네릭으로 선언

Generic Function

  • 파라미터의 타입만 다른 함수를 여러개 작성할 필요가 x
func genericFunction<T>(_ a: inout T, _ b: inout T) {
   let A = a
   a = b
   b = A
}
  • <> 안에 타입처럼 사용할 이름(T)을 선언하면 그 뒤로 해당 이름을 타입처럼 사용 가능
  • T(Type Parameter) - 실제 함수가 호출될 때 해당 매개변수의 타입으로 대체되는 Placeholder
  • 실제 함수를 호출할 때 T의 타입이 결정
  • T나 V같은 단일 문자, 혹은 Upper Camel Case를 사용

Generic Type

  • 구조체, 클래스, 열거형 타입에 선언
struct Stack<T> {
    let items: [T] = []
 
    mutating func push(_ item: T) { ... }
    mutating func pop() -> T { ... }
}
  • 인스턴스 생성
let stack1: Stack<Int> = .init()
let stack2 = Stack<Int>.init()
  • <> 안에 어떤 타입인지 명시 필요

타입 제약

  • 특정 클래스의 하위 클래스나, 특정 프로토콜을 준수하는 타입만 받을 수 있게 제약을 주는 것이 가능

프로토콜 제약

func isSameValues<T: Equatable>(_ a: T, _ b: T) -> Bool {
    return a == b               
}
  • Equatable - == 이란 연산자는 해당 프로토콜을 준수할 때만 사용 가능

클래스 제약

  • 프로토콜 제약과 같은 형태이지만 해당 자리에 프로토콜이 아닌 클래스명을 명시
  • 해당 클래스의 그 클래스의 서브 클래스 타입인 경우만 가능

제네릭 함수와 오버로딩

  • 제네릭은 보통 타입에 관계 없이 동일하게 실행 되지만, 특정 타입일때 제네릭 말고 다른 함수로 구현하고 싶다면 오버로딩 사용
func genericFuntion<T>(_ a: inout T, _ b: inout T) {
    let A = a
    a = b
    b = A
}
 
func genericFuntion(_ a: inout Int, _ b: inout Int) {
    let A = a
    a = b
    b = A
}
  • 타입 지정된 함수가 제네릭 함수보다 우선순위가 높으므로 먼저 실행

댓글남기기