object와 Generic(일반화)
1. object 사용
object로 선언하는것을 박싱(boxing)이라고 하고,
캐스팅을 통해 다시 꺼내오는 것을 언박싱(unboxing)이라고 한다.
박싱(boxing)
static void Main(string[] args)
{
object obj = 5;
object obj2 = "OBJ";
object obj3 = 3.141;
object obj4 = 3.141f;
}
오브젝트 클래스는 모든 형태의 값이 대입이 된다.
언박싱(unboxing)
int _obj = (int)obj;
string _ojb2 = (string)obj2;
double _obj3 = (double)obj3;
float _obj4 = (float)obj4;
반대로 쓸때에는 캐스팅을 해줘야한다.
2. obejct VS var
차이점
var는 우항에 있는 값을보고 자동으로 캐스팅이 된다.
object는 자료형이 그 자체로 object형이다. 이것이 가능한 이유는 상속때문이다.
C#에서 object는 최상위 부모클래스이다. int형도 float형도 string형도 object형을 상속받은 자식클래스들이다.
하지만 속도적인 문제 때문에 object를 자주 사용하지는 않는다.
3. Generic 형식
class Coda<T>
{
T[] arr = new T[10];
}
C++에서의 템플릿과 유사하다.
T를 통해 int형이 들어오면 int[] arr= new int[10]처럼 작동하고
만약 내가 정의한 Monster클래스를 T에 넣으면
Monster[] arr = new Monster[10]처럼 작동한다.
눈치챘을 수도 있지만 리스트(List)도 Generic형식으로 정의되어 있는 클래스이다.
Generic형식 정의
Coda<int> coda = new Coda<int>();
함수에 대해 사용
static void Coda<T>(T n)
{
Console.WriteLine(n);
}
두 개 이상의 인자
static void Coda<T, U>(T n, U m)
{
Console.WriteLine(n);
Console.WriteLine(m);
}
참고로 딕셔너리(Dictionary)는 두 개의 인자가 사용되었다.
4. where
T에 들어오는 인자에 대한 조건을 설정한다
자주 사용되는 것으로 struct, class, new(), '클래스명' 등에 대한 조건이 있다.
struct
class Coda<T> where T : struct
struct : T는 반드시 값형식이어야 된다는 조건
class
class Coda<T> where T : class
class : T는 반드시 참조형식이어야 된다는 조건
new()
class Coda<T> where T : new()
new() : 어떠한 인자도 받지않는 기본생성자가 있어야된다는 조건
클래스명
class Coda<T> where T : Monster
클래스명 : 클래스나 그 클래스를 상속받은 클래스여야 된다는 조건
위는 Monster클래스나 Monster클래스를 상속받은 클래스만 인자로 들어 올 수 있다.