C#은 강력한 형식(Strongly-Typed) 언어이기 때문에 모든 변수와 상수는 미리 정의된 타입을 가져야 합니다. 따라서 변수를 사용하기 전에 해당 변수가 어떤 유형의 값을 저장할 것인지 컴파일러에게 반드시 알려주어야 합니다.
하지만 실제 개발 과정에서는 저장할 값의 유형이 확실하지 않은 경우가 종종 발생합니다. 이럴 때 dynamic 키워드를 활용한 동적 프로그래밍(Dynamic Programming)으로 문제를 해결할 수 있습니다.
dynamic 키워드는 동적 타입의 변수를 선언할 때 사용됩니다. 동적 타입으로 선언된 객체는 컴파일 시점에 타입 검사를 건너뛰고, 타입 검사를 런타임까지 지연시킵니다. 즉, 모든 구문 검사와 오류 확인이 프로그램 실행 시점에 수행되며, 잘못된 연산이 있으면 그때 오류가 발생합니다.
예제 코드
using System;
namespace DemoDynamicKeyword{
class Program{
static void Main(string[] args){
dynamic MyDynamicVar = 100;
Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
MyDynamicVar = "Hello World!!";
Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
MyDynamicVar = true;
Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
MyDynamicVar = DateTime.Now;
Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
}
}
}위 예제에서 하나의 dynamic 변수에 정수, 문자열, 불리언, 날짜 등 서로 다른 유형의 값을 자유롭게 할당하고 있는 것을 볼 수 있습니다. 일반적인 정적 타입 변수라면 허용되지 않는 동작입니다.
실행 결과
위 예제의 실행 결과는 다음과 같습니다.
Value: 100, Type: System.Int32 Value: Hello World!!, Type: System.String Value: True, Type: System.Boolean Value: 01-01-2014, Type: System.DateTime
dynamic 사용 시 주의사항
dynamic은 편리하지만 남용하면 코드의 안정성이 떨어질 수 있습니다. 타입 오류가 컴파일 단계에서 잡히지 않고 런타임에 발생하기 때문에, 타입을 미리 알 수 있는 경우에는 일반적인 정적 타입이나 var 키워드를 사용하는 것이 좋습니다. dynamic은 COM 개체 연동, JSON 파싱 결과 처리처럼 타입을 사전에 알기 어려운 상황에서 활용하는 것이 바람직합니다.