C#

[C#]동적 변수(dynamic)

DevStory 2022. 2. 5.

동적 타입이란?

동적 타입은 C# 4.0에서 추가되었으며 dynamic 키워드로 변수를 선언하여 컴파일 타임에 타입 검사를 방지하기 위해 사용합니다. 대신 런타임에 타입을 확인합니다. var 타입과 가장 큰 차이점은 var 타입은 컴파일러가 초기화 값을 기반으로 변수의 타입을 결정하지만, dynamic 타입은 런타임에 타입이 결정됩니다.

dynamic intValue = 10;
dynamic strValue = "init string";

dynamic 키워드를 사용하여 동적 변수를 선언하며, 대부분의 컴파일러는 동적 타입의 변수를 객체(Object) 타입으로 컴파일합니다. 하지만, 실제 타입은 런타임에 결정됩니다.

 

var 타입으로 선언된 변수의 getType() 메서드를 호출하기 위해 strValue.get을 입력하면 자동완성 기능이 실행되는 것을 확인할 수 있습니다.

반면, dynamic 타입으로 선언된 변수의 getType() 메서드를 호출하기 위해 strValue.get을 입력하면 자동완성 기능이 실행되지 않습니다.

이러한 이유는 Visual Studio IntelliSense(Visual studio의 편리한 기능)가 동적 타입에 대해 기능을 제공하지 않기 때문입니다.

 

이번 포스팅은 동적 타입에 대해 설명합니다.

 

관련 포스팅

☞ [C#]익명 타입(Anonymous Type)


동적 타입 선언 예제

다음은 동적 타입으로 변수를 선언하고 GetType() 메서드로 런타임에 평가되는 변수의 타입을 확인하는 예제입니다.

class Program
{
    static void Main(string[] args)
    {
        dynamic intValue = 10;
        Console.WriteLine("intValue.GetType(): " + intValue.GetType());

        dynamic strValue = "string";
        Console.WriteLine("strValue.GetType(): " + strValue.GetType());

        dynamic boolValue = true;
        Console.WriteLine("boolValue.GetType(): " + boolValue.GetType());

        dynamic doubleValue = 50.20;
        Console.WriteLine("doubleValue.GetType(): " + doubleValue.GetType());

        dynamic objectVale = new { name = "Tom", age = 20 };
        Console.WriteLine("objectVale.GetType(): " + objectVale.GetType());

        dynamic arrayIntValue = new[] { 1, 2, 3 };
        Console.WriteLine("arrayIntValue.GetType(): " + arrayIntValue.GetType());

        dynamic arrayStringValue = new[] { "A", "B", "C" };
        Console.WriteLine("arrayStringValue.GetType(): " + arrayStringValue.GetType());
    }
}

실행 결과

dynamic 키워드로 선언된 변수의 실제 타입은 런타임에 결정되는 것을 확인할 수 있습니다. 그리고 var 타입과 마찬가지로 객체와 배열을 초기화 값으로 할당하는 경우 new 키워드를 사용해야 합니다.

 

동적 타입의 주의사항으로 변수를 null 값으로 초기화하는 경우 런타임에서 RuntimeBinderException 예외가 발생합니다.

 

var 타입과 또 다른 차이점이 있는데, 동적 변수는 선언 후 나중에 값을 할당할 수 있습니다.

dynamic intValue;
intValue = 10;
반응형

메서드의 매개변수

var 타입과 또 다른 차이점으로 동적 타입은 메서드 매개변수를 동적 타입으로 선언할 수 있습니다. 동적 타입으로 선언하면 런타임에 모든 타입의 매개변수를 허용합니다.

class Program
{
    static void PrintConsoleValue(dynamic param)
    {
        Console.WriteLine(param);
    }
    static void Main(string[] args)
    {
        dynamic intValue;
        intValue = 10;

        PrintConsoleValue(intValue);
    }
}

단, 다음과 같이 목적에 맞지 않게 사용하는 경우 RuntimeBinderException 예외가 발생하므로 반드시 메서드의 매개변수로 동적 타입을 사용해야 하는지 충분히 고려하도록 합니다.

class Program
{
    static void PrintConsoleValue(dynamic param1, dynamic param2)
    {
        int sum = param1 + param2;
        Console.WriteLine(sum);
    }
    static void Main(string[] args)
    {
        dynamic strValue = "ABC";
        dynamic intValue = 20;

        PrintConsoleValue(strValue, intValue);
    }
}

동적 타입의 특징

  • 동적 타입은 컴파일 타임에서 타입 검사를 우회하는 경우 사용합니다. 대신 런타임에 타입을 검사합니다.
  • 컴파일 타임에는 동적 타입의 변수를 객체로 컴파일합니다.
  • var 타입과 마찬가지로 null 값을 허용하지 않습니다.
  • 메서드 매개변수로 동적 타입을 사용할 수 있지만, 목적에 맞지 않는 경우 RuntimeBinderException 예외가 발생하므로 충분히 고려 후 사용하도록 합니다.
  • 동적 타입으로 선언된 변수는 값을 나중에 할당할 수 있습니다.
  • Visual Stduio는 동적 타입에 대해 자동 완성과 같은 편리한 기능을 제공하지 않습니다.
반응형

'C#' 카테고리의 다른 글

[C#]yield 키워드  (0) 2022.02.06
[C#]IEnumerable 인터페이스란?  (0) 2022.02.06
[C#]익명 타입(Anonymous Type)  (0) 2022.02.05
[C#]StringBuilder 사용 방법  (1) 2022.02.05
[C#]List 특정 값 존재하는지 체크하는 방법  (1) 2022.01.24

댓글