티스토리 뷰

iOS

[Swift] Generic 제네릭

Peppo 2021. 10. 30. 18:56
728x90

오늘은 아래와 같은 코드에 대해 알아보려고 합니다. 

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

바로 제네릭 ! 

 

Generic (제네릭)

사전적 의미 Generic: 포괄적인

 

Generic의 장점 ?

  • 타입에 유연하게 대처할수 있다.
  • 제네릭으로 구현한 기능과 타입은 재사용에 용이 하고, 코드 중복을 줄일 수 있습니다.

 

 

글로 보면 어떤게 편한지 모르니 코드로 보시죠!

 

먼저 Generic을 사용하지 않고 상황을 들어볼게요.

 

1) Int를 받는 타입

func swapTwoInts(inout a: Int, inout b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var a = 2
var b = 3

swapTwoInts(&a, &b)

 

2) Double을 받는 타입

func swapTwoDoubles(inout a: Double, inout b: Double) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var a = 0.1
var b = 3.8

swapTwoDoubles(&a, &b)

 

3) String을 받는 타입

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

var a = "string gazaaa"
var b = "힘들어 그만 바꿔..."

swapTwoStrings(&a, &b)

 

상당히 비효율적이죠 ??

그저 타입하나 수정하는것 때문에 함수가 하나 둘씩 늘어나고 있어요.

 

여기서 Generic을 써보면 ? 

 

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

var a = 7
var b = 30

var stringA = "string gazaaa"
var stringB = "스트링 가즈아"

var doubleA = 3.3
var doubleB = 2.0

swapTwoValues(&a, &b)
swapTwoValues(&stringA, &stringB)
swapTwoValues(&doubleA, &doubleB)

조금 감이 잡히시나요?

함수 하나로 좀전에 세개의 함수를 축약해서 사용할수 있습니다 !!

 

위의 코드 처럼 < > (꺽새) 를 이용해 사용하며, 그 뒤로 타입처럼 사용 할 수 있어요.

선언은 아래처럼 하시면 돼요.

func 함수명<T>(_ 파라미터이름: T, _ 파라미터이름: T) { }

 

자 여기서 이전 함수들과 다른것으로는 <T> 가 있죠?

T는 '타입 파라미터' 라고 하며 

placeholder로 자리 표시하는거에요.

이 파라미터는의 이름은 대문자 카멜 케이스(Camel case)로 이름을 지으셔야해요.

e.g.) T, U, TypeParameterName

 

아래코드를 한번 볼까요? 

func 함수명<Good>(_ 파라미터이름: Good, _ 파라미터이름: Good) { }

 

이렇게 써도 무방하다는거죠. 

대신 '어떠한 타입이 들어갈거다' 라고 명시적으로 적어놓는게 중요하겠죠.

 

 


 

제네릭에 가장 기본적인 기능만 알아보았는데요. 

문법은 공부하면 공부할수록 코드를 간결화 할수 있게 되는거 같아요. 

728x90

'iOS' 카테고리의 다른 글

[Swift] Extension  (0) 2021.11.09
[iOS] UIKit 에서 실시간 Preview 보는 방법  (0) 2021.11.05
[Swift] inout parameter  (0) 2021.10.26
[Swift] 타입프로퍼티, static, class  (0) 2021.10.22
공부해야할것  (0) 2021.10.21