본문 바로가기
iOS_Swift/문법 정리

Swift - Generic < >

by chozjjae 2022. 5. 17.

Generic (제네릭) 이란?

Generic을 이용한 소스는 일반 소스코드보다 유연하게 작성할 수 있고, 재사용이 가능한 함수와 타입을 지원하여 작업 할 수 있도록 정의한 것을 의미한다.

  • 이를 통해 중복을 피하고, 의도를 명확히 하여 추상적인 방법으로 코드를 작성할 수 있다.

 

작성 방법

func 함수명 <T>(x : T, y : T){ }

주로 < > 안의 값은 T를 많이 사용하지만 T로 지정해주지 않아도 된다.

  • 매개변수에 자료형을 지정해 줄때 Int, Double, String등의 지정된 자료형이 아닌 새로운 자료형으로 지정해준다.

 

비교 소스 1

평범한 함수의 선언 방법이다.

같은 유형의 함수들이지만 자료형이 다르기 때문에 Double 형과 String형이 있다면 오류가 발생한다.

func cho(x:Int, y:Int){
    print(x, y)
}
cho(x:1, y:2) //Int형
//cho(x:10.0, y:20.0) //Double
//cho(x:"x", y:"y") //String

 

but

 

Generic(제네릭)을 사용한 함수

<T> 라는 추상적인 함수를 사용하면서 같은 유형의 자료형만 다른 함수를 모두 출력할 수 있다.

func cho<T>(x:T, y:T){
    print(x, y)
}

cho(x:1, y:2) //Int형
cho(x:10.0, y:20.0) //Double
cho(x:"x", y:"y") //String

 

비교 소스 2

평범한 함수를 이용한 소스코드

같은 내용이지만 길어지는 소스코드

func choInt(_ x: inout Int, _ y: inout Int){
    let temp = x
    x = y
    y = temp
}
var a = 10
var b = 20
choInt(&a, &b)
print(a,b) //20, 10

func choDouble(_ x: inout Double, _ y: inout Double){
    let temp = x
    x = y
    y = temp
}
var c = 10.0
var d = 20.0
choDouble(&c, &d)
print(c,d) //값이 변경되서 출력
//20.0, 10.0
func choString(_ x: inout String, _ y: inout String){
    let temp = x
    x = y
    y = temp
}
var e = "cho1"
var f = "cho2"
choString(&e, &f)
print(e,f) //값이 변경되서 출력
//cho2, cho1

but

 

Generic(제너릭)을 이용한 함수

자료형 지정 X -> 간단하게 함수 정리

func cho<T>(_ x: inout T, _ y: inout T){
    let temp = x
    x = y
    y = temp
}
var a = 10
var b = 20
cho(&a, &b)
print(a,b) //20, 10

var c = 10.0
var d = 20.0
cho(&c, &d)
print(c,d) //값이 변경되서 출력
//20.0, 10.0

var e = "cho1"
var f = "cho2"
cho(&e, &f)
print(e,f) //값이 변경되서 출력
//cho2, cho1

비교 소스 3

구조체(struct)와 스택(stack)에서 제네릭(Generic)이용하기

평범한 함수를 이용한 소스코드

Double 값이나, String 값을 넣고 싶지만 모든 자료형이 Int 형이기 때문에 Int 자료형의 값만 들어간다.

struct IntStack{
    var items = [Int]() //빈 배열 생성
    mutating func push(_ item: Int){
        items.append(item)//스택 속에 값 넣기
    }
    mutating func pop() -> Int{
        return items.removeLast() //마지막 값 부터 빼내기
    }
}

var stackOfInt = IntStack()
print(stackOfInt.items) // 값이 없기 때문에 빈배열
stackOfInt.push(1) //값 넣기 1
print(stackOfInt.items) //stackOfInt 속에 있는 값 출력
print(stackOfInt.pop()) //값 빼기

stackOfInt.push(2) //값 넣기 2
print(stackOfInt.items) //stackOfInt 속에 있는 값 출력
print(stackOfInt.pop()) //값 빼기

 

but

 

Generic(제너릭)을 이용한 함수 소스코드

자료형 지정 X -> 간단하게 함수 정리

struct Stack <T>{
    var items = [T]() //빈 배열 생성
    mutating func push(_ item: T){
        items.append(item)//스택 속에 값 넣기
    }
    mutating func pop() -> T{
        return items.removeLast() //마지막 값 부터 빼내기
    }
}

var stackOfInt = Stack<Int>() 
//Generic으로 변경 후 자료형 지정

print(stackOfInt.items) // 값이 없기 때문에 빈배열
stackOfInt.push(1) //값 넣기 1
print(stackOfInt.items) //stackOfInt 속에 있는 값 출력
print(stackOfInt.pop()) //값 빼기

stackOfInt.push(2) //값 넣기 2
print(stackOfInt.items) //stackOfInt 속에 있는 값 출력
print(stackOfInt.pop()) //값 빼기
//-----------------------------------------------------------------

var stackOfDouble = Stack<String>() 
//Generic으로 변경 후 자료형 지정

print(stackOfDouble.items) // 값이 없기 때문에 빈배열
stackOfDouble.push(10.0) //값 넣기 1
print(stackOfDouble.items) //stackOfInt 속에 있는 값 출력
print(stackOfDouble.pop()) //값 빼기

stackOfDouble.push(20.0) //값 넣기 2
print(stackOfDouble.items) //stackOfInt 속에 있는 값 출력
print(stackOfDouble.pop()) //값 빼기

swift의 Array도 generic 구조체이다.

var x : [Int] = [] //빈 배열
var y = [Int]()
var z : Array<Int> = [] //Generic

var a : [String] = [] //빈 배열
var b = [String]()
var c : Array<String> = ["a","b","c"] //Generic

print(c) //["a", "b", "c"]

참조 자료 

인덕대학교 한성현 교수님 강의자료 + youtube  - smile han