마이크로소프트웨어 2009년 9,10월 연재 되었던 내용입니다.
닷넷 프레임워크(.NET Framework)도 3.5버전에 이어 벌써 닷넷 프레임워크 4.0에 대한 beta1이 출시가 되었다. 오늘 살펴 볼 내용은 닷넷 프레임워크 4.0 beta1 출시와 함께 버전이 업그레이드된 C# 4.0의 새로운 형식(type)인 dynamic 형식에 대해 알아 보도록 하겠다.
[그림] .NET Framework의 발전
C#은 2002년 C# 1.0에서 기존 C++와 같은 Unmanaged 환경에서 Managed 환경으로의 변화를 시작으로 object로 형식 선언으로 발생하는 오버헤드(Overhead)를 줄일 수 있는 C# 2.0의 제네릭(Generics), 여러 데이터 원본(Array, Collection, XML, Database 등)에서 통합적인 처리 환경을 지원하는 C# 3.0의 LINQ(Language Integrated Query), 그리고 C# 4.0의 dynamic 형식에 이르기 까지 정말 많은 발전이 이루어 졌다.
[그림] C# 버전별 특징
C# 4.0은 [그림 1]에서 보는 것처럼 다이나믹 프로그램 지원과 기존 비주얼 베이직(Visual Basic)언어와 함께 발전되는 것을 주요 설계 컨셉으로 디자인되어 [그림 2]과 같이 크게 4가지의 주요 특징들이 있으며 그 중에서 dynamic 형식이 오늘 살펴 볼 내용이다.
[그림 1] C# 4.0 설계 컨셉
[그림 2] C# 4.0 주요 특징
C# 3.0에서는 var 형식이 새롭게 등장 했었다. 그러면 C# 4.0의 dynamic과는 어떤 차이점이 있을까? [표 1] 에서처럼 가장 큰 특징은 형식이 확정되는 시점이다. var은 컴파일이 될 때 형식의 확정이 이루어지지만, dynamic은 형식의 확정되는 시점을 런타임(Runtime)시로 미루게 된다.
| |
var |
dynamic |
| 형식의 확정 시점 |
Compile time |
Runtime |
| 바인딩(binding) 방식 |
Static Binding |
Late Binding |
[표 1] var vs. dynamic
그러므로 [그림 3] 과 같이 dynamic은 var처럼 컴파일 시점에서 형식을 추정하지 않으므로 우리가 이미 인지하고 있는 형식(아래에서는 string 같은)이라도 VS 2010에서는 인텔리센스를 볼 수 없다.
[그림 3] Visual Studio 2010에서 var과 dynamic 인텔리센스 비교
지금까지의 C#은 컴파일 될 때 형식이 모두 확정이 되어야 했다. 하지만 COM Interop, 닷넷 오브젝트 리플렉션(reflection) 작업 등을 할 때 컴파일 시점에 타입을 확정 할 수 없으며, 정말 많은 코트를 작성하여야 하는 등 많은 어려움이 있었다. 이러한 불편함(?)을 한번에 해결해 줄 수 있는 것이 바로
dynamic이다.
예를 하나 들어 보자. C# 3.0에서 형식을 명시적으로 선언하지 않아도 사용 할 수 있는 익명형식(anonymous type)이 존재 한다. 이 익명형식을 ASP.NET에서 ListView 컨트롤에 바인딩을 하였고 ItemDataBound 이벤트에서 어떤 처리를 하고 싶다면, 이벤트에서 바인딩된 원본 형식으로 형 변환하여 원하는 처리를 하면 된다. 그럼 익명형식은 어떤 형식으로 형 변환을 해야 할까? C# 3.0 에서는 [코드 1] 처럼 리플렉션으로 처리해야 되었다. 속성의 값 하나를 가져오기 위해 많은 코드를 작성해야 한다.
Type ty = boundItem.DataItem.GetType(); PropertyInfo pInfo = ty.GetProperty("EmpPay"); if (pInfo != null) { int amt = Convert.ToInt32(pInfo.GetValue(boundItem.DataItem, null)); lbl.Text = amt.ToString("N0"); } |
[코드 1] C# 3.0에서의 리플렉션을 통한 익명형식의 속성(Property) 접근하지만 C# 4.0에서는 아래와 같이 간결한 코드로 작성이 가능하다.
dynamic item = boundItem.DataItem; lbl.Text = Convert.ToInt32(item.EmpPay).ToString("N0"); |
[코드 2] C# 4.0에서의 dynamic 형식을 통한 익명형식의 속성 접근
유의할 점은 dynamic은 런타임 시에 형식이 확정되므로 아무래도 컴파일 시점에 형식이 확정이 되는 것 보다는 성능에 영향을 미치게 된다. 그러므로 컴파일 시점에 형식 확정이 어려운 제한된 영역에서만 사용이 이루어 져야 하겠다. dynamic은 아래와 같이 몇 가지 경우에 제한적으로 사용하고 var처럼 잘 알고 있는 내장형식(int, string 등)에 광범위 하게 사용하면 안될 것이다.
[dynamic 형식 사용이 필요한 예]
- COM objects(COM IDispatch)
- Dynamic objects(IDynamicObject, IronPython, IronRuby, HTML DOM)
- Plain objects(.NET object reflection etc.)
아직 못다한 얘기는 너무나 많지만 지면 관계상 여기서 줄이며, 보다 많은 내용을 보고 싶은 분은 훈스닷넷(http://hoons.kr)에 방문을 하면 UCC Town에서 필자가 지난 7월에 진행을 했던 C# 4.0에 대한 세미나의 동영상을 볼 수 있다.
[ Resource ]