ecsimsw

C# / object / var / dynamic 본문

C# / object / var / dynamic

JinHwan Kim 2019. 3. 4. 05:03

object / var / dynamic

  • 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); }
     하지만 반대로 런타임시 타입이 결정되기 때문에 다른 형식보다 느리고, 비주얼 스튜디오의 인텔리전스를 사용할 수 없어 불편하다는 단점이 있다.

'Language > C++, C#' 카테고리의 다른 글

C# / Params  (0) 2019.03.15
C# / Accessing variable value by name  (0) 2019.03.08
C# / Iterators/ IEnumerator, IEnumerable / yield  (0) 2019.03.01
C# / Is와 As  (0) 2019.01.18
OOP / Up Casting / Down Casting  (0) 2019.01.18
Comments