박하의 나날

Generic(일반화), Collection

프로그래밍/Unity
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