
"모든 변수는 컴파일 시점에 타입이 정해져야 한다!"
C#은 대표적인 정적 타입 언어(Statically Typed Language)입니다.
그런데 가끔은 이런 엄격함이 답답하게 느껴질 때가 있습니다.
외부 라이브러리나 다른 언어와 소통해야 할 때처럼요.
이럴 때 우리에게 '자유'를 선물하는 dynamic 형식이 있습니다.
일반적인 변수는 컴파일 시점에 타입 검사를 엄격하게 받습니다.
만약 string변수에 ToUpper()가 아닌 Add()같은
엉뚱한 메서드를 호출하면 컴파일러가 바로 "이거 틀렸어!"하고 알려주죠.
하지만 dynamic으로 선언된 변수는 컴파일 시점에서 타입 검사를 우회합니다.
컴파일러는 그저 dynamic변수가 어떤 메서드를 호출하든,
어떤 속성에 접근하든 "알겠다."하고 넘어가 줍니다. 그리고 실제 코드가
런타임(Runtime)에 해당 메서드나 속성이 정말로 있는지 확인하죠.
var: 컴파일러가 타입을 추론해 주는 것뿐, 실제로는 정적 타입입니다.string형식으로 추론되면 영원히 string형식이죠.object: 모든 데이터 타입의 조상입니다. 어떤 데이터든 담을 수 있지만,dynamic: 컴파일 시점에는 타입 검사를 하지 않고,[코드]
// 1. var: 컴파일 시점에 string으로 타입이 확정됨
var name = "velopert";
// Console.WriteLine(name.Add(1)); // 컴파일 에러! string에는 Add 메서드가 없음
// 2. object: 모든 것을 담을 수 있지만, 사용하려면 형변환 필요
object obj = "velopert";
// Console.WriteLine(obj.ToUpper()); // 컴파일 에러! object에는 ToUpper 메서드가 없음
Console.WriteLine(((string)obj).ToUpper()); // 형변환 후 사용 가능
// 3. dynamic: 컴파일 시점에는 모든 것을 허용!
dynamic dyn = "velopert";
Console.WriteLine(dyn.ToUpper()); // 성공! 런타임에 string임이 확인되어 ToUpper() 호출
Console.WriteLine(dyn.Add(1)); // 컴파일 성공! 하지만 런타임에 예외(Exception) 발생!
[실행 결과]
VELOPERT
VELOPERT
❌예외 발생 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'string' does not...
dynamic형식은 꼭 필요한 곳에서만 보조적으로 사용해야 합니다.
1. 동적 타입(Python, Ruby)와 상호작용을 할 때
.NET 환경에서 실행되는 IronPython, IronRuby 같은 동적 언어 라이브러리와
연동할 때 dynamic은 C#과 자연스러운 다리 역할을 해줍니다.
2. COM 라이브러리 연동 (Office 자동화)
dynamic덕분에 C#으로 Office 프로그램을 제어할 수 있습니다.
하지만 주력으로 사용하기에는 단점이 명확합니다.
3. 구조를 예측하기 힘든 JSON 데이터 처리
JSON 데이터 구조가 자주 변경되거나 알 수 없는 경우에
dynamic을 사용하면 데이터를 유연하게 탐색할 수 있습니다.
dynamic은 필요가 있을 때만 제한적으로 활용해야 합니다.
dynamic형식은 항상 위험이 따릅니다.
런타임 오류의 위험: 가장 큰 단점입니다. 컴파일러가 잡아주지 못하는 오타나
잘못된 메서드 호출은 사용자가 프로그램을 실행하고 나서야 오류가 발생합니다.
성능 저하: dynamic은 런타임에 복잡한 과정을 거치기 때문에 오버헤드가 발생합니다.
정적 타입보다 성능이 느립니다. 성능이 중요한 코드에서는 사용을 피해야 합니다.
IDE 지원 상실: dynamic변수 뒤에 점(.)을 찍어도 자동 완성 기능이 동작하지 않습니다.
어떤 멤버를 사용할 수 있는지 미리 알 수 없기 때문이죠. 이는 생산성을 떨어뜨립니다.
dynamic은 C#에서 동적 타입의 유연성이 필요할 때 사용할 수 있는 강력한 도구입니다.
하지만 그 편리함 뒤에는 런타임 오류, 성능 저하, 생산성 저하라는 위험이 도사리고 있죠.
C#은 기본적으로 정적 타입 언어(Statically Typed Language)로 설계되었습니다.
일반적인 상황에서는 안정적이고 예측할 수 있는 코드를 작성하는 것이 권장됩니다.
dynamic의 장점 | dynamic의 단점 |
|---|---|
| 유연한 코드 작성 가능 | 런타임 에러 발생 위험 |
| 동적 언어/COM 연동이 편리함 | 정적 타입보다 성능이 느림 |
| 복잡한 데이터 구조를 다루기 용이 | IDE의 자동 완성 지원 불가 |