제네릭은 타입을 일반화해 코드의 재사용성을 높이고, 타입 안정성을 보장하는 기법이다. C#에서는 제네릭을 사용해 클래스, 구조체, 인터페이스, 메서드를 작성할 수 있다. 제네릭을 사용하면 특정 데이터 타입에 의존하지 않고, 다양한 데이터 타입을 처리할 수 있다.
여기서 박싱과 언박싱은 C#에서 주로 값 타입을 객체나 타입으로 변환하거나 그 반대일 경우를 말한다.
박싱은 값 타입을 object
타입 또는 임의의 인터페이스 타입으로 변환하는 과정이다. 이렇게 되면 값 타입의 값은 힙에 할당된 객체로 감싸지게 된다. 이때 박싱은 암시적으로 수행된다.
//값타입
int value = 1;
//박싱
object boxedValue = value;
여기서 value는 int 값 타입이다. boxedValue는 object 타입으로 변환되며, 이 과정에서 value는 힙에 객체로 할당된다.
언박싱은 박싱도니 객체를 다시 값 타입으로 변환하는 과정이다. 언박싱은 명시적으로 수행되며, 이는 박싱된 객체에서 원래 값 타입의 값을 추출하는 과정이다.
// 박싱
object boxedValue = 1;
// 언박싱
int value = (int)boxedValue;
여기서 boxedValue는 object 타입으로 박싱된 int 값이다. 언박싱을 통해 boxedValue에서 int 값을 추출하고 있다. 언박싱은 명시적으로 (int)와 같은 캐스팅을 통해 수행된다.
쉽게 얘기하면 값(물건)을 객체화(포장) 하는 것을 박싱, 이것을 다시 푸는 것을 언박싱이라 생각하면 될 것 같다.
제네릭 클래스를 정의하면, 다양한 데이터 타입을 처리할 수 있는 클래스를 만들 수 있다.
public class GenericClass<T>
{
private T data;
public Genericclass(T value)
{
data = value;
}
public T GetData()
{
return data;
}
public void Setdata(T value)
{
data = value;
}
}
이렇게 작성하면 다양한 타입으로 사용할 수 있다.
// int
GenericClass<int> intInstance = new GenericClass<int>(10);
// string
GenericClass<string> stringInstance = new GenericClass<string>("Hello");
int intData = intInstance.GetData(); // 10
string stringData = stringInstance.GetData(); // Hello
제네릭 메서드는 메서드 수준에서 타입을 일반화한다.
public class GenericMethods
{
public void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
}
제네릭 메서드를 호출할 때는 타입을 명시적으로 지정할 필요가 없다.
// 이건 좀 더 알아봐야할듯
GenericMethods methods = new GenericMethods();
int a = 1, b = 2;
methods.Swap(ref a, ref b);
string x = "Hello", y = "World";
methods.Swap(ref x, ref y);