PROGRAMING/C#

제네릭 : Generic

파란실버라이트 2012. 3. 12. 17:04
참조 : http://blog.naver.com/rocabilly/140133303502


제네릭은 박싱/언박싱(형변환)이 일어나지 않도록 개체의 타입을 지정하여 미지 지정하는 방법

박싱/언박싱은 메모리에 치명적입니다. 프로그램 성능에 무지 관련 있죠.
제네릭이 나온겁니다. 미리 타입을 지정함으로써 형변환 자체를 없이 하는거죠.

그럼 형변환을 먼저 봅시다. ( 따로 형변환을 안다루어도...? 그래도 다루고 싶다는...쩝 )

1. 박싱(Boxing)
int i = 3; // 값 타입
string s = i.ToString(); // 참조 타입

2. 언박싱(UnBoxing)
string s = "3" // 참조 타입
int i = (int)s; // 값 타입

값 타입과 참조 타입은 메모리에 틀리게 저장
됩니다. 값 타입은 스택(Stack)에 참조 타입은 힙(Heap)에 저장되죠.
메모리에 타입이 변환되면서 다르게 저장되는 일련의 작업들이 메모리에 치명적

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
 
namespace GenericTest
{
    class GenericClass<T, Q>
    {
        private T item { getset; }
        public Q QVal { getset; }
 
        public GenericClass(T val)
        {
            item = val;
        }
 
        public override string ToString()
        {
            return item.ToString();
        }
        public string ToString2()
        {
            return QVal.ToString();
        }
    }
 
    class MethodGenericClass
    {
        public T2 GnericMethod<T1,T2>(T1 val1, T2 val2)
        {
            Console.WriteLine(val1);
            return val2;
        }
    }
 
        
 
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList al = new ArrayList();
            al.Add(1);
            al.Add(2);
            al.Add(3);
            //ArrayList는 컬렉션으로 Object 타입을 저장합니다. 
            //Object 타입은 최상위 클래스입니다. ( 단군님이시죠 ) 그리고 참조타입입니다. 
            //따라서 동적으로 Add하여 1,2,3 숫자값(Int)을 넣으면 
            //안에서 자동으로 값타입이 참조타입으로 변하는 박싱(Boxing)
 
 
            Console.WriteLine("non Genteric : Array List");
            foreach (var item in al)//var 가 Object
            {
               // foreach 문안에도 Object 로 들어간 데이터가 int 로 형변환 되어 변경되는데
               //이것이 바로 참조타입에서 값타입으로 변하는 언박싱(UnBoxing) 
                int i = (int)item;
                Console.WriteLine(i);
            }
 
            //값 타입과 참조 타입은 메모리에 틀리게 저장됩니다. 
            //값 타입은 스택(Stack)에 참조 타입은 힙(Heap)에 저장되죠.
            //박싱,언박싱이 메모리에 치명적이라 했으니 .. 아주 속도가 
 
            List<int> list = new List<int>();
            list.Add(1);
            list.Add(2);
            list.Add(3);
 
            Console.WriteLine("Generic : List ");
            foreach (var item in list)//var 를 int32 형으로 
            {
                Console.WriteLine(item);
            }
 
            Console.WriteLine("----------------------------------------------");
 
            //Generic Class Test
            Console.WriteLine("String Generic Class");
            GenericClass<stringstring> stringClass = new GenericClass<stringstring>("chajin");
            stringClass.QVal = "got it like this";
            Console.WriteLine(stringClass.ToString());
            Console.WriteLine(stringClass.ToString2());
 
            Console.WriteLine("Int Generic Class");
            GenericClass<intDateTime> intClass = new GenericClass<intDateTime>(3);
            intClass.QVal = DateTime.Now;
            Console.WriteLine(intClass.ToString());
            Console.WriteLine(intClass.ToString2());
 
            Console.WriteLine("----------------------------------------------");
 
            //Generic Method test
            MethodGenericClass mg = new MethodGenericClass();
            int num = mg.GnericMethod<stringint>("cjoh", 3);
 
            Console.WriteLine(num);
 
            string name = mg.GnericMethod<DateTimestring>(DateTime.Now , "cjoh");
            Console.WriteLine(name);
 
            Console.ReadLine();
 
 
        }
    }
}
성능이 좋아지고 활용하면 좋을 것 같은데 어디에 써야될지 찾아봐야되는 과제가 남았네요. ^^