-
object
- object 클래스는 모든 클래스 중에서 기본 클래스로, 모든 데이터 타입의 루트형이다.
object는 모든 데이터형을 참조할 수 있지만, 해당 데이터 형의 특성을 잃어 해당 데이터형의 특성을 살리기 위해선 캐스팅을 필요로한다. 또 바꿔말하면 어떤 형으로든 캐스팅 가능하다.
"object"
static void Main(string[] args)
{
int int_integer = 3;
string str_string = "Hello";
object obj_integer = int_integer; // boxing
Console.WriteLine(obj_integer + int_integer); // error
Console.WriteLine((int)obj_integer + int_integer); // down-casting
obj_integer = str_string; // boxing
Console.WriteLine(obj_integer.ToString().ToUpper()); // can use string type method
}
이때 값 형식 데이터를 참조 형식 데이터형으로 캐스팅하는 것을 boxing / 참조 형식 데이터를 값 형식 데이터로 캐스팅하는 것을 un-boxing이라고 한다.
-
var
- var는 컴파일시에 데이터형을 컴파일러가 결정/ 생성해준다.
이때 object형을 제외한 한번 결정된 형식 외의 형식으로 캐스팅이 불가능하고, null과 포인터의 형식은 될 수 없다는 제약이 있다.
직접 형식을 결정해주지 않아도 암시적으로 결정된다는 것의 유용함은 다음의 예시에서 볼 수 있을 것이다.
"var"
class Program
{
static void Main(string[] args)
{
var iMac = new
{
model = "MMQA200/A",
price = 5000,
year = "2019.03.03"
};
iMac = "Apple"; // Error
foreach (var items in something) { }
AppDomainManagerInitializationOptions a = new AppDomainManagerInitializationOptions();
var b = new AppDomainManagerInitializationOptions();
}
}
먼저 Var iMac에서 처럼 초기화되는 객체의 타입을 지정하지 않아도 지정한 이름의 변수에 담아 간단히 사용할 있다.
또, foreach 문에서 받는 객체의 타입을 신경쓰지 않고 컴파일러가 결정하도록 할 수 있다.
마지막으로 긴 코드를 var로 간단히 줄여 가독성을 높일 때에도 유용하다.
-
dynamic
- 한번 결정되면 다른 타입으로 캐스팅이 불가능한 var 타입과 다르게 dynamic 타입은 런타임시 대입되는 값에 따라 형이 변경된다.
또, 원본형의 특성(프로퍼티나 메소드)를 잃는 object형으로의 캐스팅과 다르게 원본형을 갖고 있어 특성을 바로 활용할 수 있다는 장점이 있다.
"dynamic"
static void Main(string[] args)
{
dynamic dyn = "hello";
string i = "string";
i.ToUpper();
Console.WriteLine(dyn.ToUpper());
dyn = 3;
Console.WriteLine(dyn + 4);
}
하지만 반대로 런타임시 타입이 결정되기 때문에 다른 형식보다 느리고, 비주얼 스튜디오의 인텔리전스를 사용할 수 없어 불편하다는 단점이 있다.