2016.09.26. 20:48
Generic(일반화)
서로 다른 개념에서 공통점을 찾아, 공통된 개념을 찾아서 하나로 묶어주는 것.
int, float, string 등 다른 타입이지만, '변수' 라는 개념으로 묶어줄 수 있다.
void print(int a){console.WriteLine(a);}
void print(float b){console.WriteLine(b);}
void print(string c){console.WriteLine(c);}
이걸 일반화 하면 ↓
void print<T>(T value){console.WriteLine(value);}
ex )
static void print<일반화>(일반화 type){console.WriteLine(value)};
static void Main(string[] args){
int age= 30;
float height= 172.4f;
string name= "미스";
print<int>(age);
print<float>(height);
print<string>(name);
형식 매개변수를 사용하여 클라이언트 코드에서 메서드나 클래스를 선언한다.
인스턴스를 생성할때 까지 형식지점을 연기한다.
컬렉션 및 컬렉션을 다루는 메서드에서 자주 사용한다. (*1)
제네릭 메소드
메소드에 사용되는 매개변수의 타입을 일반화한다.
ex)
ClassA
{
public static void CopyArray(int[] arc, int[] target){
for(int i = 0; i<arc.Length; i++){
target[i] = arc[i];}
}
public static void CopyArray(string[] arc, string[] target){
for(int i = 0; i<arc.Length; i++){
target[i] = arc[i];}
}
public static void GenericCopyArray<T>(T[] arc, T[] target){
for(int i = 0; i<arc.Length; i++){
target[i] = arc[i];} //제네릭 메소드
}
}
Class Main{
public static void Main(string[] args){
int[] isrc = {1, 2, 3, 4, 5};
int[] itarget = new int[5];
string[] strsrc = {"ab", "cd", "ef", "gh", "ij"};
string[] strtarget = new string[5];
ClassA.CopyArray(isrc, itarget);
foreach(int i in itarget) console.WriteLine(i);
ClassA.CopyArray(strsrc, strtarget);
foreach(string s in strtarget) console.WriteLine(s);
float[] fsrc = {0.1f, 0.2f, 0.3f, 0.4f, 0.5f};
float[] ftarget = new float[5];
ClassA.GenericCopyArray<float>(fsrc, ftarget);
foreach(float f in ftarget) console.WriteLine(f); //제네릭 메소드활용
}
제네릭 클래스(일반화 클래스)
클래스에 사용되는 멤버변수의 타입을 일반화.
Class List<T>{ public T[] arr;}
ex)
Class List<T>{
public T[] arr;
public List(){ arr = new T[];}
}
Class Program{
static void Main(string[] args){
List<int> list1 = new List<int>();
list1.arr[0] = 10;
List<float> list2 = new List<float>();
list2.arr[0] = 3.6f;
}
}
ex2)
Class GenericClassA<T>{
public static void GenericCopyArray(T[] arc, T[] target){
for(int i - 0; i<arc.Length; i++){
target[i] = arc[i];
}
}
}
Class Main{
public static void Main(string[] args){
float[] fsrc = { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f};
float[] ftarget = new float[5];
GenericClassA<float>.GenericCopyArray(fsrc, ftarget);
foreach(float f in fTarget) console.writeLine(f);//제네릭 클래스 활용
console.ReadKey();
}
}
제약조건을 만들수 있다.
ex) 매개변수가 T 일때 where T: 제약 조건으로 사용
class List<T> where T: class //T는 클래스여야 한다.
...
void Print<U> where U:struct //U는 struct여야 한다.
...
where T:U //T는 형식 매개변수 U의 타입이거나 이를 상속받는 클래스여아한다.
...
...
등등.
|
cs |
(*1)
컬렉션 성능 문제가 있어서 일반화 컬렉션을 사용한다.
박싱-언박싱 과정에서 형변환이 무수하게 일어나면서 성능저하가 일어나는데,
이 때문에 사용한다.
제네릭 컬렉션
using System. Collectioin. Generic 내부에 있다.(네임스페이스 추가)
형식을 지정해서 사용하기 때문에 불필요한 형식변환을 발생시키지 않고,
잘못된 형식의 객체를 담는 위험을 피할 수 있다.
제네릭이 아닌 컬렉션
값을 저장하기 위해 값의 형식을 정하지 않고도 사용가능하다.
모든 참조나 값형식은 Object형식으로 암시적으로 업캐스팅된다.
항목이 값형식이면 이를 목록에 추가할 때 boxing해야 하고, 이를 검색할때 unboxing해야한다.
캐스팅이나 boxing (*2) 및 unboxing (*2) 작업은 모두 성능을 프로그램 수행성능에 영향을 준다.
제네릭 컬렉션
값의 형식을 정해야 사용이 가능하다.
타입에 맞추어 값을 저장하기 때문에 캐스팅, boxing, unboxing등의 작업이 발생하지 않는다.
제네릭 컬렉션의 종류: List, Queue, Stack, Dictionary, LinkedList...등등.
LinkedList<T> 이중연결리스트
List<T> 인덱스로 접근할 수 있는 개체 리스트
Dictionary<Tkey, TValue> 키와 값의 컬렉션을 나타낸다.
Queue<T> 크기가 변하는 선입선출(FIFO)방식의 컬렉션을 나타낸다.
Stack<T> 크기가 변하는 후입선출(LIFO) 방식의 컬렉션을 나타낸다.
(*2)
Boxing
값의 형식을 Object 형식으로 변환하는 프로세스.
int i = 123;
object o = i;
Unboxing
Object 형식에서 값 형식으로 명시적 변환하는 프로세스
int i = 123;//value type
object o = i;//boxing;
int j = (int)o; //unboxing;
|
cs |
'프로그래밍 > Unity' 카테고리의 다른 글
List<T> (0) | 2017.04.09 |
---|---|
LinkedList<T> (0) | 2017.04.09 |
인벤토리, xml연동 (0) | 2017.04.09 |
2016.09.14. 19:28~09.17 (0) | 2017.04.09 |
Regex.Matches (0) | 2017.04.09 |