C#/C#_기초강의

(C#) dynamic 동적 형식과 object 그리고 var 형식 비교

코딩ABC 2023. 5. 5. 21:35
반응형

Dynamic 형식은 변수 및 해당 멤버에 대한 참조 사용이 컴파일 시간이 아닌 런타임에 형식이 결정됩니다. 이 형식은 Office Automation API와 같은 COM API, IronPython 라이브러리 등의 동적 API 및 HTML DOM(Document Object Model. 문서 개체 모델)에 대한 액세스에 사용될 수 있습니다.

dynamic 형식의 대부분은 object 형식처럼 동작합니다. null이 아닌 모든 식은 dynamic 형식으로 변환될 수 있습니다.
dynamic 형식은 컴파일 시간에만 존재하고 런타임에는 존재하지 않습니다.

다음 예제는 dynamic 형식의 변수와 object 형식의 변수를 비교한 것입니다. 컴파일 시간에 변수의 형식을 확인하려면 변수명 위에 마우스 포인터를 올리면 됩니다.

        static void Main(string[] args)
        {
            dynamic dy = 100;
            object  ob = 100;

            Console.WriteLine(dy.GetType());
            Console.WriteLine(ob.GetType());
        }

런타임에서는 둘 다 동일한 형식입니다. 다음 그림은 위 코드의 결과를 나타낸 것입니다.

 

컴파일 시간에 2 문장의 차이를 보려면 다음 코드를 추가해 봅니다.

        static void Main(string[] args)
        {
            dynamic dy = 100;
            object  ob = 100;

            dy++;
            ob++;

            Console.WriteLine(dy.GetType());
            Console.WriteLine(ob.GetType());
        }

ob++ 식에 컴파일 오류가 있습니다. 그러나 dy++ 식은 컴파일시에 형식이 확인되지 않으므로 오류를 지적하지 않습니다.

 

dynamic 식은 var 형식과도 비슷해 보일때가 있습니다. 그러나 두 형식은 서로 다릅니다.

        static void Main(string[] args)
        {
            var vr = 100;
            dynamic  dy = 100;

            vr = "C#";
            dy = "C#";

            Console.WriteLine(dy.GetType());
            Console.WriteLine(ob.GetType());
        }

var 형식은 컴파일시에 초기식에 의해서 그 형식이 결정됩니다.

이후로는 해당 형식으로만 사용할 수 있습니다. 그래서 위 코드에서 vr="C#" 식은  컴파일 오류입니다.

그러나 dynamic은 var와는 달리 컴파일시에 그 형식이 결정되지 않으며, var 처럼 초기식에 의해 그 형식이 완전히 결정되는 것이 아닙니다.

즉, 런타임시에  그 형식이 자동으로 결정됩니다.

dynamic  dy = 100;
dy = "C#";       // 오류 아님

 

다음 예제는 dynamic 형식이 var 형식처럼 초기식에 의해 그 형식이 완전히 결정되지 않고, 런타임시에 자유롭게 다른 형식으로 변화되고 있음을 보여주고 있습니다.

        static void Main(string[] args)
        {
            dynamic  dy = 100;
            Console.WriteLine(dy.GetType());

            dy = "C#";
            Console.WriteLine(dy.GetType());
        }

dynamic 형식

 

 

반응형