선택한 부분을 인쇄합니다. 클립보드로 복사합니다. 강좌의 전체내용을 선택합니다.
hoons닷넷
[ C#.NET 고급강좌]
  미리보는 C# 4.0 - dynamic 형식
 작성자 : 김수영  작성일 : 2010-01-28 오후 8:07:01
 E-mail : dotnethelper골뱅이gmail.com  Homepage : http://www.dotnetngene.kr
마이크로소프트웨어 2009년 9,10월 연재 되었던 내용입니다.

닷넷 프레임워크(.NET Framework)도 3.5버전에 이어 벌써 닷넷 프레임워크 4.0에 대한 beta1이 출시가 되었다. 오늘 살펴 볼 내용은 닷넷 프레임워크 4.0 beta1 출시와 함께 버전이 업그레이드된 C# 4.0의 새로운 형식(type)인 dynamic 형식에 대해 알아 보도록 하겠다.
.NET Framework의 발전
[그림] .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# 버전별 특징
C# 4.0은 [그림 1]에서 보는 것처럼 다이나믹 프로그램 지원과 기존 비주얼 베이직(Visual Basic)언어와 함께 발전되는 것을 주요 설계 컨셉으로 디자인되어 [그림 2]과 같이 크게 4가지의 주요 특징들이 있으며 그 중에서 dynamic 형식이 오늘 살펴 볼 내용이다.
C# 4.0 설계 컨셉
[그림 1] C# 4.0 설계 컨셉
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에서는 인텔리센스를 볼 수 없다.
Visual Studio 2010에서 var과 dynamic 인텔리센스 비교
[그림 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 ]
- C# 4.0 문서 및 Sample
http://code.msdn.microsoft.com/csharpfuture/Release/ProjectReleases.aspx?ReleaseId=1686 
- The Future of C# (PDC 2008)
http://channel9.msdn.com/pdc2008/TL16/
- Natural Interop with Silverlight, Office and Python in Microsoft Visual C# and Microsoft Visual Basic (PDC 2008)
http://channel9.msdn.com/pdc2008/TL54/ 
- Visual Studio 2010 and .NET Framework 4 Training Kit - May Preview
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=752cb725-969b-4732-a383-ed5740f02e93 
- Visual Studio Team System 2010 Team Suite Beta 1
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=255fc5f1-15af-4fe7-be4d-263a2621144b

평점: 9.4/10 (5명 참여)   
트랙백 주소 : http://www.hoons.kr/30995/BoardTrackback.aspx ()
등록된 트랙백 0

나도한마디
사용자
글등록 +12736  덧글등록 +11135
몬난아            [2010-01-29]
Level 58
 [EXP.211/250]
희안하내요...
좋은강좌 감사합니다.
사용자
글등록 +12300  덧글등록 +150
영웅닷넷            [2010-02-01]
Level 13
 [EXP.0/40]
좋은글 잘 읽었습니다.^^
Dynimic 형식에 대해 조금은 알거 같네요^^
사용자
글등록 +120  덧글등록 +18
별빛            [2010-02-05]
Level 2
 [EXP.8/16]
좋은 강좌 잘 보고 갑니다^^
사용자
글등록 +120  덧글등록 +16
changd            [2010-02-17]
Level 2
 [EXP.2/16]
좋은 자료 감사합니다.
사용자
글등록 +1212  덧글등록 +113
소년하루            [2010-02-18]
Level 3
 [EXP.5/16]
좋은정보 감사합니다. var도 유용하지만 dynamic 멋지군요...
사용자
글등록 +1248  덧글등록 +121
칼머리            [2010-02-19]
Level 6
 [EXP.12/14]
내공이 부족하여 무슨말인지 ... 잘...
잘읽었습니다
사용자
글등록 +120  덧글등록 +19
ame            [2010-02-23]
Level 2
 [EXP.11/16]
좋은 강좌 감사합니다.
사용자
글등록 +120  덧글등록 +18
콩알킴            [2010-03-05]
Level 2
 [EXP.8/16]
좋은자료 감사합니다~
사용자
글등록 +12236  덧글등록 +1110
운용풍호            [2010-03-06]
Level 17
 [EXP.25/70]
좋은 내용 잘 보고 갑니다.
사용자
글등록 +120  덧글등록 +12
인피치            [2010-03-15]
Level 1
 [EXP.6/16]
좋은자료 감사합니다~ ^^
사용자
글등록 +1260  덧글등록 +137
kass            [2010-03-22]
Level 12
 [EXP.3/40]
프레임웍 4.0이 나오는거군요 ~
dynamic.. 흠 정보 감사합니다. ^^
사용자
글등록 +120  덧글등록 +119
군도리            [2010-03-24]
Level 4
 [EXP.9/16]
좋은 강좌내요^^
사용자
글등록 +1248  덧글등록 +1384
ryan            [2010-06-08]
Level 30
 [EXP.36/50]
좋은 강좌 감사합니다. 배울게 정말 많고 급속도로 늘어나는군여...
ㅠ.,ㅠ
사용자
글등록 +122058  덧글등록 +1324
메이로니            [2010-07-14]
Level 47
 [EXP.86/100]
좋은 자료 감사합니다.