[Swift] 제네릭(Generic) 1편 - 제네릭, 함수

어흥·2024년 6월 17일

Swift

목록 보기
22/28

Generic

Write code that works for multiple types and specify requirements for those types.

여러 타입에 대해서 요구사항을 정하여 코드가 동작하게 도와준다.

Generic 코드는 정의한 요구사항에 어떠한 타입이라도 동작할 수 있는 유연하고 재활용성이 높은 함수나 타입을 작성하게 해준다.

🔑 key: 타입에 제한되지 않는 타입이나 함수 작성 가능 → 유연성 up! 재활용성 up!

제네릭이 해결할 수 있는 문제

swapTwoInts

  • 파라미터로 받는 a, b 값을 서로 교환하는 함수
  • inout 키워드: 파라미터는 함수 내부에서 let으로 선언되어 사용되므로 원칙적으로 변경 불가, 변경하기 위해서는 inout 키워드를 작성해야함
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)

이렇게 swapTwoInts 기능은 유용하지만 단점 존재 → Int 타입에 한정해서 사용 가능

String, Double 타입에 대해서 swap 기능을 사용하려면 두 타입을 파라미터로 받는 함수를 새로 정의할 필요

func swapTwoStrings(_ a: inout String, _ b: inout String) {
    let temporaryA = a
    a = b
    b = temporaryA
}

func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
    let temporaryA = a
    a = b
    b = temporaryA
}
  • 위 함수는 a, b의 타입이 반드시 같아야 합니다. Swift는 type-safe 언어로 서로 다른 타입의 교환을 허락하지 않음(컴파일 타임 에러 발생)

⁉️→ 단순히, (인풋)타입만 다르고 구현 내용은 완전히 동일하므로 동일 로직을 포함하는 코드 반복할 필요가 없음

해결사 등장!

🧙‍♂️🧙‍♂️ Generic code🧙‍♂️🧙‍♂️

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

이처럼, 타입(형식)에 관계없이 한번의 구현으로 모든 타입을 처리하여 유연한(유지보수 쉽고, 재사용성 높은) 함수 / 구조체 / 클래스 / 열거형 등을 일반화 가능한 코드로 작성 가능

  • 2개이상 선언 가능
    func swapTwoValues<T, U>

제네릭 함수

함수 이름을 작성한 뒤 ‘< >’를 작성하고 안에 타입 파라미터 작성

func swapTwoValues<T>(_ a: inout T, _ b: inout T)

  • 타입 파라미터는 첫글자를 대문자로 작성 → Element, T, Type…
    • 파라미터 형식, 함수 바디, 리턴형에서 사용
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

Reference.

Generics | Documentation
앨런 Swift문법 마스터 스쿨

0개의 댓글