Type

Value Type

  • 값이 바로 할당되는 타입
    • 직접 값을 가지고 있다
    • int, float, char 등이 이에 해당한다
  • System.ValueType으로부터 상속

Reference Type

  • 데이터를 직접 가지고 있지 않고, 변수의 주소값을 가지고 있다
    • 즉, 주소 공간의 위치를 참조한다
    • 하나의 주소 공간을 참조하는 여러 개의 변수를 사용할 수 있다
    • Pointer의 작동 방식과 동일하다고 볼 수 있다

Object Type

  • C#에서 모든 타입의 root가 되는 base class이자 Type이다
    • CTS(Common Type System)
  • 어떤 타입으로든지 캐스팅을 통해 할당될 수 있다
  • 값 타입이 object type으로 변환될 때를 boxing
  • object type이 값 타입으로 변환될 때를 unboxing이라 한다

Dynamic Type

  • 어떤 타입의 값이든지 이에 할당할 수 있다
dynamic a = 20;
  • object type과 유사하지만, type checking이 런타임에 이루어진다
    • object type은 컴파일 타임에 type checking한다

String Type

  • string 타입과 System.String 타입은 동일
  • 역시 object type으로부터 상속된다
  • 두 가지 형식으로 할당이 가능하다
String str = "asdf";
str = @"asdf";

그 외

  • 유저 정의의 class, delegate, interface 등이 있다

Pointer Type

  • C 혹은 C++의 포인터와 동일하게 작동한다
    • 몇가지 조건 하에…

typeof와 GetType의 차이

typeof

  • 클래스 자체의 타입을 반환
class Animal {}

System.Type t1 = typeof(Animal); // t1에 Animal이 타입으로서 반환

GetType

  • 런타임시 생성되는 객체 본래의 타입을 반환
class Animal {}
class Dog : Animal {}

void PrintType (Animal a)
{
  bool b1 = a.GetType() == typeof(Animal);  // a 인자의 본래 타입은 Dog -> false
  bool b2 = a is Animal;                    // a 인자의 클래스는 Animal이기도 함
  bool b3 = a.GetType() == typeof(Dog);     // a 인자의 본래 타입은 Dog -> True
}

Dog d = new Dog();
PrintType(d);

출처