본문 바로가기

카테고리 없음

C# dynamic 사용 이유

Dynamic형식의 사용

Microsoft Docs에서 그 의미를 찾아보면 다음과 같습니다.

이 형식은 정적 형식이지만 dynamic 형식의 개체가 정적 형식 검사를 건너뜁니다. 대부분의 경우 이 형식은 object 형식을 가지고 있는 것처럼 작동합니다. 컴파일 시간에 dynamic 형식의 요소는 모든 연산을 지원하는 것으로 간주됩니다. 따라서 개체가 값을 COM API, IronPython 같은 동적 언어, HTML DOM(문서 개체 모델), 리플렉션 또는 프로그램의 다른 곳 등 어디서 가져오든 신경을 쓸 필요가 없습니다. 그러나 코드가 유효하지 않으면 런타임 시 오류가 catch됩니다. MS Docs 보기

번역기를 통한 문장이어서 인지 의미가 아리송합니다. @.@ 위의 설명을 이해하려면 먼저 알아야 하는 개념이 있습니다.

컴파일타임(Compiletime)과 런타임(Runtime)인데 이에 대한 자세한 설명은 여기서 반드시 이해하고 오시기 바랍니다. 


dynamic형식은 컴파일 타임에 해석되지 않고 런타임에 해석됩니다. 컴파일러는 다이내믹 타입에 대해선 타입체킹을 스킵하죠. 그렇기 때문에 어떠한 에러도 일어나지 않습니다. 그렇기 때문에 생기는 단점도 있습니다. 컴파일 타임에 해석되지 않기 때문에 비주얼 스튜디오에서 제공하는 인텔리 센스를 이용할 수 없게 됩니다. 런타임에서 메소드나 프로퍼티가 적절하지 않다면 비로소 에러를 발생하게 됩니다.


바로 이 지점에서 var와 dynamic이 많이 비교되곤 하는데요, 

var는 static 타입으로 다음과 같은 코드에서 컴파일러는 변수 s가 string타입이라는 것을 정확하게 알고있습니다.

var apple = "사과"; Console.WriteLine(apple.Length); //apple를 치면 인텔리센스가 제시됩니다.


하지만 dynamic은 좀 다릅니다. dynamic은 object와 매우 유사하게 다루어집니다. 다음의 코드에서 컴파일러는 s.Length에 대해서는 아무런 판단도 하지 않습니다.

dynamic apple = "사과";
Console.WriteLine(apple.Length); //apple를 쳐도 인텔리센스가 제시되지 않습니다.

위의 코드는 런타임에 아무런 에러도 발생시키지 않겠지만 다음의 코드는 런타임에 에러를 발생시킵니다. 실행시 Brix 속성을 찾을수 없기 때문이죠.

dynamic apple = "사과";
Console.WriteLine(apple.Brix);


실제 프로그램 코딩시 dynamic타입은 메소드 파라메터로 자주 사용됩니다.

class Program
{    
    static void PrintValue(dynamic val)
    {
        Console.WriteLine(val.GetType());
    }

    static void Main(string[] args)
    {
        PrintValue("HelloWorld!");
        PrintValue(1000);
        PrintValue(10.50);
        PrintValue(true);
        PrintValue(DateTime.Now);
    }
}


프로젝트의 성공을 기원합니다.