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 { get; set; }
public Q QVal { get; set; }
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<string, string> stringClass = new GenericClass<string, string>("chajin");
stringClass.QVal = "got it like this";
Console.WriteLine(stringClass.ToString());
Console.WriteLine(stringClass.ToString2());
Console.WriteLine("Int Generic Class");
GenericClass<int, DateTime> intClass = new GenericClass<int, DateTime>(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<string, int>("cjoh", 3);
Console.WriteLine(num);
string name = mg.GnericMethod<DateTime, string>(DateTime.Now , "cjoh");
Console.WriteLine(name);
Console.ReadLine();
}
}
}
성능이 좋아지고 활용하면 좋을 것 같은데 어디에 써야될지 찾아봐야되는 과제가 남았네요. ^^