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
'iOS_Swift > 문법 정리' 카테고리의 다른 글
Swift - 고차함수(Higher - order function) (0) | 2022.05.20 |
---|---|
Swift - Array(배열) (0) | 2022.05.18 |
Swift - 오류 처리[Error Handling] (0) | 2022.05.15 |
Swift - 옵셔널 체이닝(Optional Chaining) (0) | 2022.05.14 |
swift - 클래스, 구조체, 열거형 비교 (0) | 2022.05.12 |