Search

'Visual Studio 2010'에 해당되는 글 260건

  1. 2010.05.10 Welcome to Dynamic C#(18) - 이름을 붙이면서 벌어진 일들.
  2. 2010.05.10 [MFC/윈도우 7 멀티터치] #2 : 제스처(gesture)를 이용한 구현(上) 3
  3. 2010.05.07 Welcome to Dynamic C#(17) - 필요한 말만 하고 삽시다. 2
  4. 2010.05.06 Visual Studio 2010, 2008, 2005 에서 .NET Framework 1.1 개발하기
  5. 2010.05.05 Welcome to Dynamic C#(16) - dynamic이라도 이건 안되는 거임. 2
  6. 2010.05.03 VS 2010 기능소개 05 - Visual C#&VB 개발자 IDE Tips & Tricks 두번째
  7. 2010.05.03 Welcome to Dynamic C#(15) - A/S for dynamic.
  8. 2010.05.03 Visual Studio Team Foundation Server 2010 설치 전 할일
  9. 2010.04.26 [JumpToDX11-12] DirectCompute 의 절차.
  10. 2010.04.21 Visual Studio 2010! 나랑 놀아보자 – 기본편 (6회) - Generate from Usage 2
  11. 2010.04.16 Visual Studio 2010 RTM 추가 완소 정보
  12. 2010.04.14 Visual Studio 2010! 나랑 놀아보자 – 기본편 (5회) - Navigate To
  13. 2010.04.14 Visual Studio 2010 e-book 무료로 다운로드 하세요 1
  14. 2010.04.14 Visual Studio 2010 출시에 따른 SharePoint Developer Tools
  15. 2010.04.14 한국 Visual Studio 2010 사용자를 위한 트위터 커뮤니케이션
  16. 2010.04.13 Visual Studio 2010 출시와 완소 정보 총 정리 4
  17. 2010.04.12 VC++ 10에 구현된 C++0x의 코어 언어 기능들 1
  18. 2010.04.09 Visual Studio 2010! 나랑 놀아보자 – 기본편 (4회) - Call Hierarchy
  19. 2010.04.08 Visual Studio 2010! 나랑 놀아보자 – 기본편 (3회) - Box Selection
  20. 2010.04.08 Visual Studio 2010! 나랑 놀아보자 – 기본편 (2회) - VS IDE

Welcome to Dynamic C#(18) - 이름을 붙이면서 벌어진 일들.

C# 2010. 5. 10. 09:00 Posted by 알 수 없는 사용자
- 무슨일인데 그러냥?

네. 언제나 기존의 질서안에서 새로운 변화를 가져오려고 하면 새로운 문제들이 생기기 마련이죠. 오늘은 매개변수에 이름을 붙이면서 생겨난 문제와 내용에 대해서 설명을 드려보려고 합니다. 우끼끼끼!!


- 이름은 다 어디서 가져오놔?

우선, CLR이 파라미터 이름은 메서드 시그니처의 일부로 보지 않기 때문에 A라는 메서드를 오버라이드해서 B라는 메서드를 작성한다고 할때, A와 B의 파라미터 이름이 다르다고 해도 전혀 문제되지 않습니다.

public class Animal
{
    public virtual void Eat(string foodType = "Rice")
    {
    }
}

class Monkey : Animal
{
    public override void Eat(string bananaType = "Rainbow Banana")
    {           
    }

    static void Main(string[] args)
    {
        Monkey m = new Monkey();
        Animal a = m;

        m.Eat(bananaType: "Black Banana");
        a.Eat(foodType: "Hamburger");
    }
}


위의 예제를 보시면, Animal을 Monkey가 상속해서 Eat을 오버라이드 하고 있습니다. 하지만 메서드 간의 파라미터 이름은 전혀 문제가 되지 않습니다. 그런데요, 이름이 틀리게 되면 또 하나의 의문점이 생길 수 있습니다. 언제 어떤 이름이 쓰이는 걸까요? 해답은 생각보다 간단합니다. 수신자를 중심으로 생각하는 것이죠.

여기서 수신자란 메서드의 호출대상이 되는 객체를 말하는데요. 'm.Eat()'에서는 m이 수신자가 되는 것이죠. 즉, 'm.Eat'에서 m은 정적타입인 Monkey타입의 객체입니다. 그래서 m.Eat에서는 Monkey클래스에 정의된대로, 'bananaType'을 파라미터의 이름으로 가져옵니다. 그리고 a.Eat에서는 Animal클래스에 정의된대로, 'foodType'을 파라미터의 이름으로 가져오는 것이죠. 주의깊게 보셨다면, m에서 생성한 객체를 그대로 a에 넣어주는 걸 보실 수 있습니다. 즉, 동일한 객체라는 의미인데요. 동일한 객체에 대해서라도, 수신자를 중심으로 파라미터의 이름을 가져온다는 이야기가 되는거죠.


- 이름을 가져올 때 안에서 벌어지는 일.

class Calc
{
    static double CalcRatio(double source,
        double factor1 = 0.87,
        double factor2 = 1.0)
    {
        return source * factor1 * factor2;
    }

    static void Main(string[] args)
    {
        CalcRatio(92.1, factor2:1.11);
    }
}


위와 같은 코드를 가지고 생각을 해보겠습니다. 실제로 위 코드가 실행될 때까지 어떤 일이 벌어지는지 말이죠. 우선 컴파일러가 'CalcRatio'를 호출하는걸 보게되면, 이름을 붙이지 않은 매개변수가 이름을 붙인 매개변수보다 앞쪽에 있는지 확인을 합니다. 그리고 매개변수에 붙인 파라미터의 이름이 중복되지 않는지 확인합니다. 같은 파라미터에 두개의 매개변수를 넘길수는 없으니 말이죠. 그리고는 적용가능한 모든 후보메서드군을 생성합니다. 위의 예제에서는 딱 한개뿐이죠. 그 후에는 각각의 후보메서드에 대해서 몇가지 검사를 합니다.

일단 메서드 호출에 적혀있는 파라미터의 이름이 후보군에 있는 메서드의 파라미터 이름과 동일한지 검사합니다. 여기서는 'factor2'의 이름을 각 후보메서드가 파라미터로 가지고 있는지 확인하겠죠. 그리고 이름이 붙은 모두 매개변수와 파라미터가 일치하는지 확인합니다. 즉, CalcRatio의 파라미터 중에 이름이 붙지 않은 매개변수를 받지 못한 factor1, factor2는 이름이 붙은 매개변수를 받아야 한다는 것이고, 같은 파라미터에 중복되는 매개변수가 없어야 한다는 것이죠.

만약에 이름이 붙은 매개변수나 이름이 붙지않은 매개변수 어느 것도 받지 못한 파라미터가 있다면, 컴파일러는 그 파라미터가 옵셔널 파라미터인지 검사합니다. 만약에 그 파라미터가 옵셔널 파라미터라면, 기본값을 파라미터에게 넘겨줄 매개변수로 사용하게 됩니다.

이런과정을 겨처서 매개변수 목록이 정리되면, 컴파일러는 늘 하듯이, 각 매개변수가 형변환에 문제가 없는지 확인을 합니다. 위의 예제에서 정리된 매개변수의 목록은 ['92.1', '0.87', '1.11']가 되겠죠.

이 모든 과정은 철저하게 컴파일 시점에서 벌어지는 'syntactic sugar'입니다. syntactic sugar는 그저 프로그래머의 수고를 덜어주는 역할을 하는 기능을 뜻하는 데요, 지금까지 설명드린 'Named and Optional Parameters'는 새로운 참조를 요구하지도 않고, 새로운 호환성 문제를 만들지도 않습니다. 생성된 IL을 보면, 그냥 일반적으로 호출하는 모양과 차이가 없기 때문이죠. 즉, 컴파일러가 위에서 설명드린 과정을 거쳐서 정리된 매개변수의 목록을 만들고 나면, 프로그래머가 원래 똑같은 매개변수목록으로 메서드를 호출한 것 처럼 처리를 합니다. 그래서 컴파일이 되고 난 후에, 메서드의 파라미터 이름이 바뀌거나 새로운 옵셔널 파라미터가 추가되어도 아무문제 없이 동작하는 것이죠.


- 중요한 거 한가지만 더!! 캬캬캬

class Calc
{
    static int GetNum1()
    {
        Console.WriteLine("GetNum1");
        return 1;
    }

    static int GetNum2()
    {
        Console.WriteLine("GetNum2");
        return 1;
    }

    static int GetNum3()
    {
        Console.WriteLine("GetNum3");
        return 1;
    }

    static void DoSth(int num1, int num2, int num3)
    {
    }

    static void Main(string[] args)
    {
        DoSth(num3: GetNum3(),
        num1: GetNum1(),
        num2: GetNum2());
    }
}


위와 같은 예제가 있다고 했을때요, 아마도 컴파일러는 매개변수의 순서를 재정렬해서 num1, num2, num3의 순서로 각 파라미터에 넘겨줄 것 같은데요. 메서드안의 GetNum시리즈는 어떤 순서로 평가될까요? 써있는 순서대로 앞에서 뒤로 할 것같다고 생각하셨다면 정답! 입니다. 처음에 GetNum3, GetNum1, GetNum2의 순서로 말이죠. 결과를 보시면 명확합니다.


내부적으로는 각 파라미터에 대한 표현식의 결과를 저장할 공간을 임시로 만들고, 각 표현식의 결과를 저장한 후에, 그 임시값들을 순서에 맞게 재정렬해서 파라미터에게 넘겨준다고 합니다. 재밌지 않나요? 저만 그런가효? 호호호호-_-;;;;


- 마치면서

이제 Named and Optional Parameter(도대체 한글로 뭐라고 써야할지 감이 안잡히네요-_-)에 대해서 기본적인 이야기는 한 것 같은데요. 처음에는 '그냥 파라미터에 기본값을 줄 수 있고, 매개변수를 넘겨줄 때 순서를 바꿔서 줄 수도 있다' 이정도 인줄 알았는데, 공부를 하다보니 생각보다 복잡하기도 하고 재미있는 내용이 많아서 글로 정리하면서도 즐거웠습니다. 오늘은 여기까지 하죠~~~~~!


- 참고자료

1.
http://blogs.msdn.com/samng/archive/2009/04/01/named-arguments-and-overload-resolution.aspx

[MFC/윈도우 7 멀티터치] #2 : 제스처(gesture)를 이용한 구현(上)

MFC 2010. 5. 10. 08:30 Posted by 알 수 없는 사용자

Intro

안녕하세요. MFC 카테고리의 꽃집총각입니다.

한동안 여러 가지 다른 행사와 게으름으로(;;) 포스팅이 많이 늦어졌습니다 ^^; 지난 글에서는 ( [윈도우 7 멀티터치] #1 : 멀티터치 UX를 적용하는 3단계 전략 ) 멀티터치 프로그래밍을 내 애플리케이션에 적용하는 방법을 3단계로 나누어 설명하였습니다. 이 중 첫 번째 단계인 ‘추가 코딩 없이도 기본적으로 얻을 수 있는 기능들’에 대해 자세히 알아보았고, 나머지 두 단계는 기본적인 내용만 소개해 드렸습니다. 이번엔 이중에서 두 번째 단계인 제스처(gesture) 이용한 프로그래밍 방법에 대해 자세히 알아보도록 하겠습니다.

note : 지난번 까지는 프로그래밍 이야기 보다는 개념적인 설명이 위주였기 때문에 ‘Windows 7 Development’ 카테고리에 글을 올렸습니다만… 이제부터는 본격적으로 구현에 대한 이야기가 시작되니까 ‘MFC’ 카테고리에서 연재하도록 하겠습니다. 앞부분은 어느 언어를 사용하든 멀티터치 프로그래밍을 위해 알아두어야 할 공통적인 내용들이었고요, 제가 앞으로 말씀드릴 부분은 주로 MFC를 위한 구현방법이니까, 이게 맞는 거겠지요. :)

 

제스처를 인식하는 첫 번째 예제 프로그램

이제까지는 제가 주로 개념설명이나 이론적인 부분들을 모두 말씀 드리고 나서 예제 코드를 알아봤었는데, 이런 쌍팔년도식 학습법은 요즘은 별로 어울리지 않는 듯 합니다 ^^;… 일단은 돌아가는 예제 프로그램을 간단하게 한 번 작성해 보기로 하지요. 그게 자질구레한 설명도 줄여주고, 공부하기도 좀 더 쉬울 것 같네요 ㅎㅎ

첫 번째로 구현해볼 예제는 view 영역에 그려진 box를 터치로 조작, 변환하는 프로그램 입니다.

view 영역에 box를 하나 표시하고, 손가락으로 사각형을 이동, 회전, 확대/축소 할 수도 있고, Press  & Tap 제스처를 통해 색상을 변경할 수도 있고, Twi Finger Tap 제스처로 X표시를 하거나 지울 수도 있는 프로그램입니다. 예제를 따라서 작성해 보면 MFC 애플리케이션에서 어떻게 제스처를 다룰 수 있는지 쉽게 이해하실 수 있습니다. 해당 예제는 Windows 7 SDK에 들어있는 MFC 샘플 중에 하나입니다. 영어에 부담이 없으신 분들은 직접 Windows 7 SDK를 확인해 보셔도 좋을 것 같군요 ^^ ( http://channel9.msdn.com/learn/courses/Windows7/Multitouch/Win7MultiTouchGestureMFC/Exercise-1-Build-a-Multitouch-Gesture-Application/ )

 

Task 1 : MFC Application 프로젝트를 만들자

우선 Visual Studio 2010에서 MFC Application 프로젝트를 하나 만드세요. Application Wizard에서는 고전 MFC 스타일의 SDI 타입을 지정해 줍니다. Wizard의 설정 화면을 활자 설명 대신 스크린샷으로 대신하겠습니다.

 

Task 2 : 하드웨어 상태를 알아봅시다

본격적인 멀티터치 UX를 구현하기에 앞서, 현재 구동중인 실행환경이 멀티터치가 가능한 상태인지를 확인해야 합니다. 멀티터치를 인식 가능한 하드웨어가 연결되어 있는지, 그리고 사용 가능한 상태인지를 알 수 있어야겠지요. 이런 정보를 얻고자 할 때는 예전부터 익히 사용해오던  ::GetSystemMetrics(…) 함수를 이용하면 됩니다.

int WINAPI GetSystemMetrics( __in  int nIndex );
http://msdn.microsoft.com/en-us/library/ms724385(VS.85).aspx

GetSystemMetrics는 운영체제의 여러 가지 설정 정보들을 얻어올 수 있는 API로 예전부터 자주 사용되던 함수입니다. 윈도우 캡션 영역, 메뉴 영역 등의 너비를 얻을 수 있기 때문에 UI 작업할 때 많이 사용해 보셨을 겁니다. MFC/Win32 API에 새롭게 추가되는 기능들은 상당 부분 이렇게 이전 인터페이스를 그대로 사용하고 있기 때문에 공부하기가 특히 어렵지 않은 느낌이어서 마음에 듭니다 ㅎㅎ 이 함수로 터치인식 정보를 얻고 싶을 땐 아래의 새로운 flag들을 사용합니다.

  • SM_DIGITIGER : 입력장치 상태 확인
  • SM_TABLETPC : 타블렛 pc 여부 확인
  • SM_MAXIMUMTOUCHES : 최대 동시입력 가능한 터치 개수

이번에 공부하면서 보니, 윈도우 XP가 타블렛 PC edition이란게 따로 있었더군요… SM_TABLETPC는 이런 정보를 확인할 때 쓰는 값이고, 나머지 두 flag는 Vista 이하 OS에서는 인식하지 않습니다. 각 항목의 자세한 값은 MSDN을 참고하시면 되고요, 기본적인 경우라면 아래의 코드를 가져다 사용하시면 되겠습니다. 현재 멀티터치 입력 가능 여부와 동시 입력 개수를 알아보는 코드입니다.

   1: BYTE digitizerStatus = (BYTE) GetSystemMetrics(SM_DIGITIZER);
   2: if ((digitizerStatus & (NID_READY | NID_MULTI_INPUT)) == 0) //Stack Ready + MultiTouch
   3: {
   4:     AfxMessageBox(L"현재 터치 입력이 불가능한 상태입니다.");
   5:     return FALSE;
   6: }
   7:  
   8: BYTE nInputs = (BYTE) GetSystemMetrics(SM_MAXIMUMTOUCHES);
   9:  
  10: CString str;
  11: str.Format(L"현재 %d개의 터치를 동시 인식할 수 있습니다.", nInputs);
  12: AfxMessageBox(str);

그리고… 멀티터치 프로그래밍 공부가 하고 싶은데 하드웨어가 마땅치 않을 때… 제가 예전에 말씀 드렸던 시뮬레이션 환경 설정 ( http://multitouchvista.codeplex.com/ ) 기억하고 계시죠? 기억이 안 나시는 분은 ( [멀티터치]멀티터치 프로그래밍 환경 구축하기 ) 링크를 참고해 주세요 ^^

위에 있는 코드를 그대로 복사해서 CTouchGestureDemoApp::InitInstance() 함수에 넣어주세요. 그리고 애플리케이션을 실행하면 아래와 같은 창이 뜹니다.

아따, 많기도 하여라 @.@… 동시에 255개의 터치를 인식할 수 있군요. 저도 터치 입력 환경을 시뮬레이션 해서 공부하고 있는데, 이런 경우 동시 입력 개수가 255개로 나오게 됩니다 ㅎㅎ

 

Task 3 : View 영역에 사각형을 그리자!

샘플을 따라 해보기 위해서 화면에 box를 그려주는 코드를 우리가 일일이 직접 작성할 필요는 없겠죠. 지금은 제스처의 인식 방법을 알아보고 싶은 거니까요. Windows 7 SDK에서 box 드로잉을 해주는 코드를 제공하고 있으니, 이 코드를 사용하도록 하겠습니다. 그리고 우리는 멀티터치 제스처를 이용하는 방법에만 집중하기로 합시다. box를 그려주는 CDrawingObject라는 클래스의 소스는 아래에서 다운 받으실 수 있습니다.

위의 파일을 다운 받으셔서 프로젝트에 포함하고, stdafx.h 파일의 아래쪽에 헤더파일 인클루드 구문을 넣어줍니다. 기본적으로 작성되어 있는 상태에서 #include <afxcontrolbars.h> 아래에 넣어주면 됩니다.

   1: #include "DrawingObject.h"

그리고 ChildView.h를 열고 View 클래스의 멤버 변수로 CDrawingObject 객체를 하나 선언해 줍니다.

   1: // The drawing object
   2: CDrawingObject m_drawingObject;

마찬가지로 View 클래스의 멤버 변수로, box의 확대/축소와 이동을 처리하기 위해 필요한 변수들을 몇 가지 더 추가해 줍니다.

   1: // Needed for drawing object position and size calculations
   2: double m_dblZoomRatioStart;
   3: double m_dblZoomRatioTotal;
   4: CPoint m_ptCenter;

그리고 box를 그려주기 위해서, CChildView.cpp에 있는 CChildView::OnPaint() 함수의 제일 아래쪽에 box drawing 코드를 넣어줍니다.

   1: m_drawingObject.Paint(&dc);

그다음, 윈도우 크기를 변경할 때 box의 크기와 위치를 기본값으로 초기화 해주는 코드를 넣어줍니다. box가 화면영역을 벗어나거나 한 경우 초기화 코드가 있으면 좋겠지요. 그러기 위해서 먼저 WM_SIZE 메세지 핸들러를 추가합니다.

Ctrl + Shift + X 키를 눌러 MFC 클래스 위자드(MFC Class Wizard)를 띄웁니다. MFC 클래스 위자드는 VC++ 6.0에 있던 툴인데, Visual Studio .NET 2002 통합 환경으로 변경되면서 사라졌지만 이번에 Vusial Studio 2010에서 새롭게 부활했습니다. 거의 10년 만이라고 할 수 있군요. 예전에 사용해 보신 분들이라면 아주 익숙한 인터페이스 일겁니다. 여기에서 CChildView의 WM_SIZE 메세지를 선택해서 핸들러를 추가해 줍니다. 아래 스크린샷을 참고하세요.

MFC 클래스 마법사의 부활은 VS2010의 핵심적인 변화 요소중에 하나입니다. 클래스 마법사의 활용 부분은 다음 기회에 별도의 포스팅으로 자세하게 설명하도록 하겠습니다.

생성된 CChildView::OnSize 함수에 아래의 코드를 넣어줍니다.

   1: m_drawingObject.ResetObject(cx, cy);

여기까지 진행했다면 이제 drawing 처리의 완성입니다. 프로젝트를 빌드하고 애플리케이션을 실행하면 아래와 같이 빨간 box가 drawing 되는 모습을 확인하실 수 있습니다.

 

Outro

한 번의 포스팅에서 예제의 완성과 추가설명까지 모두 다루려고 했지만 그러기엔 글이 너무 길어질 것 같네요. 이쯤에서 한 번 호흡을 끊고, 다음 포스팅에서 실질적인 제스처 인식 코딩 방법과 추가설명을 정리하도록 하겠습니다. (下편은 바로 올릴 예정이니 조금만 기다려 주세요)

이번 글에서는 제스처를 인식하는 예제 프로그램의 작성 방법을 단계적으로 소개하고, 하드웨어의 멀티터치 인식 여부 확인 방법을 알아보았고, 아주 짧게나마 VS2010에서 새롭게 부활한 MFC 클래스 마법사에 대한 언급이 있었고, 첫 번째 멀티터치 예제의 작성 방법을 절차적으로 알아보았습니다. 제스처를 이용한 멀티터치 구현 하(下)편에서는 제스처를 인식해 box를 이동, 변환 시키는 코드의 작성과 샘플을 통해 알아볼 제스처 인식 프로그래밍의 부가 정보 및 팁들을 소개해 드리도록 하겠습니다.

그럼 곧바로 하(下)편으로 찾아 뵙겠습니다.
감사합니다 ^^*

Reference

Welcome to Dynamic C#(17) - 필요한 말만 하고 삽시다.

C# 2010. 5. 7. 09:00 Posted by 알 수 없는 사용자
- 이젠 dynamic을 벗어나서!

문득 제가 거의 1년 가까이 dynamic만 이야기를 했다는 걸 깨달았습니다.-_-;;;; C# 4.0에 dynamic만 추가된게 아닌데 말이죠;;; 반성을 하면서! 이제 dynamic말고 다른 이야기를 좀 하겠습니돠.


- 파라미터에 기본값을 설정하는거지.

프로그래밍을 하다보면, 여러가지 파라미터를 가지는 메서드를 작성하는 경우가 많은데요. 호출시에 꼭 매번 넘겨줘야 하는 파라미터가 있는가 하면, 대부분의 경우 그냥 한가지 값으로만 쭉~ 사용하는 파라미터도 있습니다. 그래서 C#에서는 늘~ 메서드 오버로딩을 통해서 파라미터가 축약된 메서드를 정의해주고, 그 메서드 안에서 원래의 메서드를 호출하면서, 기본값을 매개변수로 넘겨주는 형태를 취했습니다. 그래서 많은 프로그래머들이 메서드를 정의할 때, 파라미터에 기본값을 정의할 수 있게 해달라고 요청했습니다. 그리고 그 메서드를 호출할 때, 기본값을 그대로 쓰는 경우에는 매개변수를 생략할 수 있게 해달라고 말이죠.

C# 4.0에서 파라미터에 기본값을 설정하는데는 두가지 방법이 있는데요,

class C
{
    static int Add(
        [DefaultParameterValueAttribute(10)] int num1,
        int num2 = 30)
    {
        return num1 + num2;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(Add(15));
    }
}


위의 코드를 보시면, num1에는 DefaultParameterValueAttribute라는 어트리뷰트가 붙어있는 걸 보실 수 있는데요. 이건 그냥 하위호완성과 COM, VB와의 상호운용을 위해서 만들어진거라고 합니다. 이 방법은 권장되지 않는데요, 왜냐하면 이 어트리뷰트는 특정 파라미터에 기본값이 있다는 건 명시하지만, 그 파라미터가 옵션인지 아닌지는 명시할 수 없기 때문입니다. 즉 컴파일러 조차 이 파라미터가 옵션으로 생략가능한지 인식하지 못합니다. 그래서 결국에는 명시된 기본값은 아예 사용되지도 못하는 거죠.

그리고 'num2' 파라미터를 보시면 이 부분은 두가지 의미가 있습니다. 첫째는 컴파일러에게 이 파라미터가 옵션으로 생략가능하다는 걸 알려주는 거구요, 둘째는 프로그래머가 이 파라미터에 아무 값도 안 넘겨주때 사용할 수 있는 기본값을 컴파일러에게 알려주는 것입니다. Add메서드를 호출할 때 인텔리센스를 보면요,


위에서 말씀드린대로, 'num1' 파라미터에 대해서는 기본값은 설정이 되어있지만, 옵션이라는 표시가 없기 때문에 생략할 수 없습니다. 그렇기 때문에 어트리뷰트에 명시된 기본값은 아예 사용되지 않는 것이구요. 그리고 'num2' 파라미터를 보시면, 기본값이 30이라고 표시되는 걸 보실 수 있습니다. 그리고 이렇게 표시된 파라미터는 옵션으로 생략가능한 것이구요. 위의 코드를 실행하면, 15와 'num2' 파라미터의 기본값인 30이 더해져서 45라는 결과가 나오게 됩니다.


- 파라미터에 기본값을 설정하면 어케 되는고얌~?

위의 Add메서드를 리플렉터에서 보면 아래와 같습니다.

private static int Add([DefaultParameterValue(10)] int num1,
                              [Optional, DefaultParameterValue(30)] int num2)
{
    return (num1 + num2);
}

'num1' 파라미터는 위에서 선언해준 어트리뷰트가 그대로 설정되어 있는 걸 보실 수 있구요. 'num2' 파라미터를 보시면, 기본값을 설정하는 게 실제로는 두가지 일을 한다는 걸 알 수 있습니다. 파라미터에 DefaultParameterValue 어트리뷰트를 통해서 기본값을 설정하고, 이 파라미터가 옵션으로 생략가능함을 나타내는 Optional이라는 표시도 하게 되는 것이죠. 이런 두가지 어트리뷰는 이미 CLR에 존재했다고 합니다. VB.NET에서는 이미 제공되던 기능이니깐 당연한 이야기겠죠.

여담이지만, VB.NET과 C#개발팀이 통합되었다고 합니다. 서로 같이 크면서 동일한 기능을 제공하고자 하는 'coevolution'전략을 위함이라고 하는데요. 그 덕분일까요? C#에도 오늘 소개해드리는 기본값을 설정하는 기능이 추가되었고, VB.NET에도 C# 3.0에서 추가되었던 '컬렉션 이니셜라이저'나 '자동으로 구현된 속성'같은 기능이 추가되었습니다. 자세한 내용은 여기를 참고하시면 되겠네요.

그런데 기본값을 설정할 때, 몇가지 규칙이 있는데요. 첫째로는 옵션으로 생략가능한 파라미터는 생략불가능한 파라미터를 모두 선언한 뒤에 나와야 합니다.


위와 같이 옵션인 파라미터가 먼저 나오고, 뒤에 반드시 필요한 파라미터를 선언하면, 옵셔널 파라미터는 반드시 꼭 필요한 파라미터들 뒤에 나와야 한다고 경고메세지가 뜨는 걸 볼 수 있습니다. 그리고 ref나 out으로 설정된 파라미터는 기본값을 설정할 수 없습니다. 왜냐하면, ref나 out에 대응되는 상수값이 존재하지 않기 때문이죠.

그리고 호출시에 옵셔널 파라미터로 설정된 파라미터에 매개변수를 넘겨주지 않으면, 컴파일러는 DefaultParameterValue 어트리뷰트에 설정된 기본값을 가지고 와서, 그 값을 매개변수로 해서 메서드를 호출하는데 사용하게 됩니다.


- 매개변수에게 이름을 허 하여뢋!

형을 형이라고 부르지 못하고, 아버지를 아버지라 부르지 못한 건 아니지만, 매개변수는 늘 이름없는 설움을 겪어야 했습니다. 파라미터는 이름이라도 갖고 있었죠. 태어나서 이름하나 세상에 남기지 못하는게 얼마나 슬픈....여기까지 하고 이야기 계속 하겠습니다.-_-;

이제 이름붙인 매개변수를 사용하게 되면, 이 모든 장점을 제대로 활용할 수 있게 됩니다. 만약에 모든 파라미터가 옵셔널 파라미터 라면, 그 중에 값을 넘겨주고 싶은 것들만 이름을 붙여서 매개변수를 넘겨줄 수 있는 것이죠. 기존의 오피스등의 COM 프로그래밍을 할 때, 대부분의 값들이 옵션으로 생략하능한 파라미터지만, C#에서는 그것들을 생략할 방법이 없어서 의미도 없는 값을 반복해서 넘겨줘야 했던 걸 생각하면 굉장히 편해질거라는 생각도 드네요.


이름붙인 매개변수는 메서드를 호출할 때 사용되는 데요. 예제를 보시면요,

class C
{
    static double CalcRatio(
        double fact1 = 90.0,
        double fact2 = 0.9887,
        double fact3 = 33.211)
    {
        return fact1 * fact2 * fact3;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(
            CalcRatio(fact1:40.12, fact3:13.11)
            );
    }
}


위의 예제를 보면, 세상에 이런 엉터리 계산식이 있을진 모르겠지만 아무튼 뭔가의 비율을 계산하는 메서드인 CalcRatio가 있습니다. 계산할 때 일반적으로 고정된 상수들이 있을 수 있는데요, 그런 경우를 위해서 기본값을 설정해두었습니다. 그리고 호출하는 부분은 보시면, 'fact1', 'fact3' 파라미터에 넘겨질 값들에 각각 이름을 붙인 것을 볼 수 있습니다. '40.12'는 'fact1'파라미터에 넘겨질 매개변수이고, '13.11'은 'fact3'파라미터에 넘겨질 매개변수 인 것이죠.

매개변수에 이름을 붙이는 건, 꼭 기본값이 있는 옵셔널 파라미터에만 한정되는 않습니다.

class C
{
    static double CalcRatio(
        double superfactor,
        double fact1 = 90.0,
        double fact2 = 0.9887,
        double fact3 = 33.211)
    {
        return superfactor * (fact1 * fact2 * fact3);
    }

    static void Main(string[] args)
    {
        Console.WriteLine(
            CalcRatio(fact1:(40.12 / 2), fact3:13.11, superfactor:100)
            );
    }
}


위의 예제와 같이 기본값이 없는 일반 파라미터에 넘겨줄 매개변수에도 이름을 붙일 수 있으며, 매개변수의 순서는 파라미터의 순서와는 전혀 상관없이 배열할 수 있습니다. 그리고 'fact1'의 매개변수처럼 원래 매개변수로 넘겨줄 때 할 수 있는 것 처럼 아무 표현식이든지 올 수 있습니다.


- 마치면서

그동안 아주 오랫동안.... 게으름과 겹치면서 너무 오랫동안 dynamic에 대해서만 이야기를 해왔는데요. 문득 돌아보니 dynamic외에도 다룰 내용이 좀 더 있다는 걸 깨달았습니다.-_-;;;; 머리가 둔하면 이렇죠. 하하하하하>ㅇ<


- 참고자료

1. http://blogs.msdn.com/samng/archive/2009/02/03/named-arguments-optional-arguments-and-default-values.aspx

Visual Studio 2010, 2008 버전에서는 .NET Framework 2.0, 3.5, 3.5 SP1 을 선택할 수 있는 Multi Targeting(멀티 타게팅) 기능을 제공합니다. 최신의 .NET Framework 버전을 선택하여 개발할 수 있으며, 하위 호환성 있는 개발을 위해 최신의 Visual Studio 에서 하위 .NET Framework 버전을 선택할 수 있습니다.

하지만 Visual Studio 2010, 2008 의 Multi Targeting 은 .NET Framework 1.x 를 지원하지 않습니다. 프레임워크 버전과 개발 도구간의 비호환성 문제 때문에 .NET Framework 1.x 버전은 Visual Studio 2003 으로만 개발이 가능합니다.

하지만 아래의 방법을 통하여 Visual Studio 2010, 2008, 2005 도구를 이용하여 .NET Framework 1.x 를 개발할 수 있는 환경을 구성할 수 있습니다.

기존의 Visual Studio 2003 은 MSBuild(Microsoft 통합 빌드 솔루션) 를 지원하지 않기 때문에, .NET Framework 4.0 SDK 에 포함된 MSBuild Targets 를 사용하였습니다.

   

Visual Studio 2003 으로 개발된 프로그램

아래와 같이 간단한 ConsoleApplication1 프로젝트를 만들었습니다.

이 응용 프로그램을 실행하면 다음과 같은 결과가 나옵니다.

Mscorlib.dll 의 버전이 1.0.5000.0 인 것을 확인할 수 있습니다.

   

Visual Studio 2010 으로 프로젝트 컨버팅 하기

만들어진 Visual Studio 2003 프로젝트를 Visual Studio 2010 버전으로 컨버전합니다.

컨버전이 완료되었으면 프로젝트 파일(.csproj) 을 열어 아래와 같이 수정합니다.

먼저 기존의 .NET Framework 어셈블리를 .NET Framework 1.1 의 어셈블리로 강제로 변경해 줍니다. Visual Studio IDE 에서 .NET Framework 1.1 을 추가하면 2.0 이상의 어셈블리가 추가되므로 반드시 .csproj 파일에서 변경해 주어야 합니다.

그리고 Import 노드에 Microsoft.Csharp.v1.1.targets 의 라인을 추가해 줍니다.

   

Microsoft.CSharp.v1.1.targets 파일 만들기

$(MSBuildToolsPath) 의 폴더인 C:\Windows\Microsoft.NET\Framework\v4.0.30128 경로에서 Microsoft.CSharp.targets 파일의 복사본 이름을 Microsoft.CSharp.v1.1.targets 파일로 만들어 줍니다.

위의 방법으로 Microsoft.Common.target 파일을 Microsoft.Common.v1.1.targets 파일 이름으로 복사본을 만듭니다.

 

Microsoft.CSharp.v1.1.targets 파일 수정하기

아래의 노드를 찾아서 <NoWarn> 노드의 1701; 1702 값을 제거합니다. 이 값은 .NET Framework 1.1 의 경고 값으로 사용할 수 없는 값입니다.

그리고 아래의 CSC 노드를 찾아서 ErrorReport 속성을 제거합니다. .NET Framework 1.1 SDK 의 CSC.exe 는 ErrorReport 기능이 존재하지 않기 때문입니다.

추가로 CSC 노드의 ToolPath 의 경로를 아래와 같이 수정합니다. 이 경로에 포함되는 csc.exe 를 사용하여 .NET Framework 1.1 로 빌드하는 중요한 구문입니다.

아래의 Import 노드를 찾아서 복사본으로 만들었던 Microsoft.Common.v1.1.targets 파일명으로 변경합니다.

   

Microsoft.Common.v1.1.targets 파일 수정하기

아래의 노드를 찾아 붉은 영역의 노드를 추가합니다. 만약 TargetFrameworkVersion 노드를 .csproj 파일에 명시적으로 수정하게 되면, Visual Studio 2010 은 v2.0 이상 버전으로 변경을 해야 프로젝트 파일을 로드할 수 있기 때문에 Microsoft.Common.v1.1.targets 파일에서 변경해야 합니다.

아래의 ReportingServiceTargets 노드를 찾아 주석으로 처리하거나 삭제합니다.

아래의 _DebugSymbolsIntermediatePath 노드의 ItemGroup 을 주석으로 처리합니다. $(IntermediateOutputPath) 이미 기존의 Microsoft.CSharp.targets 에서 값이 선언되었으므로 같은 값이 추가되거나 할 경우 Collection Type 으로 간주하기 때문에 이 구문은 필요가 없습니다.

마찬가지로 아래의 구문도 $(IntermediateOutputPath) 는 Collection Type 으로 처리가 되는 것을 방지하기 위해 아래의 구문도 주석으로 처리하거나 제거합니다.

아래의 구문도 위와 같은 이유로 제거하거나 주석으로 처리합니다.

아래의 Code Analysis 기능은 Visual Studio 2003 에서 통합되어 제공되지 않기 때문에 제거하거나 삭제합니다.

   

Visual Studio 2010 에서 .NET Framework 1.1 빌드 하기

모든 구성이 완료 되었으면, Visual Studio 2010 에서 ConsoleApplication 을 실행해 봅니다. 빌드가 .NET Framework 1.1 로 빌드된 것을 확인할 수 있습니다.

   

Welcome to Dynamic C#(16) - dynamic이라도 이건 안되는 거임.

C# 2010. 5. 5. 09:00 Posted by 알 수 없는 사용자
- Long time no see~

오랜만이죠~? 다행히 기다려주신 분이 없는 거의 없는 관계로 마음은 불편하지 않았습니다. 그런데 왜 눈물이 아흙.... 아직 못한 이야기가 조금 있는거 같아써! 조금 더 이야기를 하도록 할께영~ 호호호호-_-


- 상황1. dynamic타입의 변수에 들어있는 값을 변환시키기

다음과 같은 코드가 있다고 가정을 했을 때요,

static void Main()
{
    dynamic d = 10;
    d++;
}

어떤 일이 벌어질까요? d에는 11이라는 값이 있어야 할 것 같지만, dynamic타입은 실제로는 object타입이기 때문에 다른 결과가 나옵니다. dynamic타입이 실제로는 object라는 건 이전에 이야기 했던 내용인데요, 자세한 내용은 이전포스트를 참고하시면 되겠습니돠. 아무튼 처음에 d에 10을 넣을 때, int에서 object로 박싱이 일어나구요, 두번째 줄에서 d에서 언박싱한 값을 가지고 ++연산을 수행합니다. 하지만 이 값은 다시 박싱되어서 저장되지는 않는다는 게 문제입니다. 그러면 결과는 여전히 10을 가리키겠죠.

그런데 이런 문제는 런타임 바인더의 구조 덕분에 해결이 가능했다고 하는데요. 이전에 말씀드렸듯이 런타임 바인더는 동적인 구문을 적절한 객체와 연산으로 바인딩하고 그 결과를 Expression Trees의 형태로 DLR에게 리턴해줍니다. Expression Trees의 장점은 목표로 하는 형태로 변환되기 전에, 여러가지 변환이나 최적화가 용이하다는 점이 었는데요, Expression Trees에 박싱된 값을 언박싱하고 값을 변화시키는 요소가 있고, 그 값을 다시 박싱해서 저장하는 것도 있다고 합니다. 그래서 이런형태의 동적인 표현식을 제대로 처리할 수 있다고 하네요.


- 상황2. 중첩된 구조체 연산

이번 문제는 조금 더 알쏭달쏭한데요. '.'으로 여러번 연결된 표현식을 생각해보면요, 각각 부분별로 쪼개셔서 바운딩이 됩니다. 즉 A.B.C.D같은 표현식이 있다고 하면요, A.B에 대한 사이트를 만들고, 다시 그 결과를 .C의 수신자로 하는 사이트를 만들고, 다시 그 결과를 .D의 수신자로 하는 사이트를 만듭니다. 꽤나 현명하게 잘 만든거 같다는 생각이 들긴하는데요. 원래 컴파일러가 하는거랑 같은 방식이기도 하구요. 그런데 문제는 런타임의 구조상 ref형식으로 값을 리턴할 수 없다는 제약때문에 생깁니다. 물론 이런 제약은 CLR의 제약은 아닙니다. 다만 닷넷의 언어중에서 ref 리턴을 지원하는 언어가 없기 때문인데요. 그 말은 만약에 값형 변수에 대해서 연속적으로 '.'으로 연결된 표현식이 있다면, 대상이 되는 변수의 값은 박싱이 되면서 복사본이 생깁니다. 그리고 이후에 '.'로 연결된 것들은 그 복사본을 대상으로 연산이 수행된다는 것이죠. 예제를 보시면요,

public struct S
{
    public int i;
}

class D
{
    public S s;
    static void Main(string[] args)
    {
        dynamic d = new D();
        d.s = default(S);
        d.s.i = 10;
        Console.WriteLine(d.s.i);
    }
}


10이 결과로 찍힐거라고 예상할 수 있지만, 결과는 아래와 같습니다.


앞에서 설명드린대로, 'd.s.i = 10'에서 구조체 S가 박싱되면서 복사본이 생겼고, 그 복사본의 i에 10을 대입했기 때문에, 원래의 'd.s'의 i값에는 변화가 없는 것이죠. 이 문제는 참고하고 있는 Sam Ng의 2008년 12월 15일자 글에서 어떻게 할지 고민중이라고 적혀있었는데요. 출시된 VS2010에서 확인해본 결과 아무런변화가 없어서, 그대로 두기로 결정한 것으로 보입니다. 뭐 결국 핵심은 dynamic은 object랑 비슷하기 때문에 박싱이 일어난다는 점입니다.


- 상황3. 명시적으로 구현된 인터페이스의 메서드

우선 명시적으로 구현된 인터페이스의 메서드가 뭔지 부터 이야기를 해야 할 것 같습니다.



위 그림을 보면, S가 IEnumerable를 구현한다고 선언을 한 상태인데요. 인터페이스를 구현하는 방식에 'Implement Interface'와 'Implement Interface Explicitly'가 있는 걸 볼 수 있습니다. 전자가 우리가 흔히 인터페이스를 구현할 때 써온 암시적 인터페이스 구현이구요. 후자가 여기서 말씀드릴 명시적 인터페이스 구현입니다. 우선 위의 두 경우에 코드 모양이 어떻게 틀린지 확인해보도록 하지요.

public class S : IEnumerable
{
    public int i;

    #region IEnumerable Members

    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }

    #endregion
}

- 암시적 인터페이스 구현의 경우

public class S : IEnumerable
{
    public int i;

    #region IEnumerable Members

    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }

    #endregion
}

- 명시적 인터페이스 구현의 경우

틀린 점을 발견하셨나요? 첫째로 명시적 인터페이스 구현의 경우, 메서드 이름인 GetEnumerator앞에 인터페이스의 이름이 '.'과 함께 붙어있습니다. 이 메서드가 어떤 인터페이스를 통해 구현된 건지 명시적으로 보여주는 것이죠. 그리고 한정자가 없으므로 private입니다. 그러므로 이 메서드는 인터페이스를 구현했지만 밖으로 노출이 되지 않습니다. 이렇게 명시적인 인터페이스 구현을 하는 경우에는 몇가지가 있을 수 있는데요. 이에 대한 더 자세한 설명은 유경상 수석님의 글을 참고하시면 매우 자세하게 아실 수 있습니다. 그럼 명시적 인터페이스 구현에 대한 설명은 여기까지로 하구요, 이게 dynamic과 무슨 관련이 있는지 알아보도록 하겠습니다. 아래와 같은 예제가 있다고 할때 말이죠,

public interface IFoo
{
    void M();
}

class C : IFoo
{
    #region IFoo Members

    void IFoo.M()
    {
        Console.WriteLine("C.M()!!");
    }

    #endregion
}

class D
{       
    static void Main(string[] args)
    {
        dynamic d = new C();

        d.M();
    }
}


예상으로는 "C.M()!!"이라는 메세지가 출력될 것 같기도 한데요. 그런데 앞서 말씀드렸던 명시적 인터페이스 구현의 특성 때문에, 런타임에 클래스C에서는 M이라는 이름의 메서드를 찾을수가 없다고 합니다. 그래서 런타임 바인더가 호출에 대해서 묶을 수 있는 IFoo라는 타입을 찾을 수 없다고 하네요. 이런 문제 때문에 위의 코드는 아래와 같은 에러를 내게 됩니다.


C라는 타입에 M의 정의가 없다는 에러메세지를 내면서 호출은 실패하게 됩니다.


- 마치면서

이제 비주얼 스튜디오 2010이 정식으로 출시되면서 C# 4.0에 대한 이야기도 현실과 매우 가까운 이야기가 되었습니다. 다만, 제 능력부족으로 글의 내용은 비현실적인거죠-_-;; 아무쪼록 도움이 되셨기를 바라면서 오늘은 여기서 끗~!


- 참고자료

1. http://blogs.msdn.com/samng/archive/2008/12/15/dynamic-in-c-vi-what-dynamic-does-not-do.aspx
2. http://www.simpleisbest.net/archive/2008/06/23/2423.aspx

 

이번에는 두번째로 프로젝트를 만들거나 새롭게 cs 또는 vb 파일을 추가할 도움이 되는 것입니다.

 

바로 프로젝트를 생성할 나타나는 화면입니다.

 

 

여기서 우리는 그냥 해당하는 프로젝트를 선택합니다. 그리고 프로젝트 만들기를 하는데 VS 2008에서는 .NET 플랫폼의 선택 기능이 있었습니다. VS 2010에서는 다른 보다 우선 설치된 템플릿과 기존에 만들었던 템플릿들 온라인 템플릿으로 나우어 집니다. 첫번째인 Recent Templates 최근에 만들었던 것으로 여러분들이 기존에 만들었던 템플릿을 불러옵니다.

 

이렇게 기존에 만들었던 템플릿을 가져와서 템플릿을 이용하여 다시 만들수가 있습니다. 다음은 설치된 템플릿입니다.

설치된 템플릿은 여러분들 설치한 VS 2010 언어에 맞추어 템플릿이 표시됩니다.

 

 

 

바로 이렇게 표시가 되죠.^^ 그렇다면.. 바로 위에 있는 Enable loading of per user extensions 틀릭하면 도구상자의 옵션 대화상자를 열고 안에 있는 Extension Manager 메뉴를 호출합니다. 여기서 "Automatically check.." 하면 자동으로 자기가 템플릿 관련 확장을 체크하여 업데이트를 합니다.

 

 

 

다음이 온라인 템플릿입니다. 템플릿은 온라인상에서 템플릿을 불러오는데 바로 사용자를 추가로 새롭게 템플릿을 만든 것을 지원하는 것입니다. 바로 사이트에 있는 내용을 가져오는 것입니다.

 

http://visualstudiogallery.msdn.microsoft.com/en-us

 

 

화면은 이렇게 나오는데 왼쪽 템플릿 메뉴에 여러 목록이 있는데 목록에 해당하는 것을 선택하면 선택한 것만 표시됩니다.

  

 

 

물론 기존의 VS 2008 있는 .NET 선택할 있게 되어있는 것은 그대로입니다. 하나 추간된 것은 왼쪽의 Sort by라고 하는 부분이 추가되어 정렬도 있습니다. Sort by VS 2008에서는 없는 것입니다.

 


.NET 선택 시에는 2.0 버전부터 선택할 있으며(이건 당근이죠 ^^) 그외 .NET 버전도 선택할 있습니다.

 

여기 More Frameworks 부분입니다. 그러면 닷넷 프레임 워크 홈페이지로 이동을 합니다. 주소는

http://msdn.microsoft.com/en-us/netframework 이쪽으로 이동을 하여 추가적인 닷넷 프레임워크를 지원합니다. 사이트에는 지금까지의 닷넷을 다운로드 받을 있도록 하고 있습니다.(예를 들어 SharePoint 2010 개발하기 위하여는 최소한 .NET Framework 3.5 이상을 선택해야 합니다.)

 

이제 이번 글의 하이라트라고 있을까요? Search 입니다.

 

 

부분은 IE 에서 많이 보셨거나 Windows Desktop Search 사용해 보신 분은 이거~ 하실 겁니다.

바로 VS 프로젝트 템플릿을 찾아주는 역활을 합니다. 제가 여기서 C 라고 입력하면 C 관련된 템플릿이 표시됩니다.

 

cs 하면 C#관련 내용일 것입니다. 이것이 중요한 것은 중간에 파일을 추가할 class 파일을 추가 할때 어떨가요? 해당 프로젝트에서 클래스 하나 추가할 때에도 도움이 됩니다.(사실 중간에 강의 하거나 갑자기 class 파일 하나 만들때 가끔 어디 있는지 못찾을 때가 .)

 

바로 생각외로 도움이 것입니다.(사실 정말 도움이 됩니다 ㅋㅋㅋ)

 

오늘은 VS 에서 새롭게 프로젝트를 생성하거나 중간에 프로젝트를 추가 또는 class 이나 cs 또는 aspx파일을 같은 것을 추가하는 대화 상자를 봤습니다. 사실 여기서 집고 넘아가는 것은 개발자에게 파일을 찾기, 또는 추가 할때 위치가 어디 있는지 갑자기 당황 스럽거나 또는 기존에 만들었던 템플릿을 다시 만들고자 할때 쉽고 빠르게 만들 있도록 도와 준다는 것입니다.

 

한가지 확실히 도움을 받습니다. 프로젝트 파일을 추가할 경우 저는 C# , C++, Modeling 같이 있으며 Web Services파일등이 있을 추가하려고 하는 파일을 쉽게 찾아서 추가 한다는 것입니다. 정말 편리합니다. 이것을 조금 유식하게(?) 하면 바로 생산성 향상 측면으로 볼수 있을 겁니다.

 

그럼 다음 번에는 실제 코딩과 관련 있는 부분을 보겠습니다.

Welcome to Dynamic C#(15) - A/S for dynamic.

C# 2010. 5. 3. 09:00 Posted by 알 수 없는 사용자

- 긴급 A/S 출동!

제가 글을 쓰면서 공부했던 내용들이 많이 바뀌었습니다-_- 그래서 저도 좀 뒤늦게 그 업데이트를 확인했구요~ 그래서 바뀐 내용에 대해서 A/S들어갑니다~~!


- 오버로드 판별 A/S!

아마 이 시리즈를 관심있게 읽어주신 분이라면!... 아흙 왜 또 눈물이... 아무튼 읽어주신 분이라면 유령메서드라는 걸 보셨을텐데요. 그게 너무 복잡하다보니, 유령메서드랑 관련한 내용은 하나도 채택되지 못했다고 합니다. 그리고 굉장히 간단한 규칙으로 정리를 했습니다. 만약에 어떤 메서드를 호출할 때 dynamic타입의 매개변수가 끼어있다면, 그 메서드에 대한 호출은 동적으로 디스패치된다는 것입니다. 그리고 런타임에서 dynamic타입의 매개변수의 실제값에 맞는 타입을 선택한다고 합니다.

class C
{
    static void M(dynamic d) { Console.WriteLine("dynamic"); }
    static void M(string s) { Console.WriteLine("string"); }
    static void M(int i) { Console.WriteLine("int"); }

    static void Main(string[] args)
    {
        dynamic d = "test";
        M(d);
    }
}


위와 같은 예제를 보면, M에 대한 호출은 런타임에 디스패치 됩니다. 그리고 어떤 M이 선택될지는 d의 실제값에 달여있는데요, 여기서는 d의 실제값이 string이기 때문에, 'M(string)'이 선택됩니다. 그러면, M(dynamic)은 어떻게 되는 걸까요? 바뀐 규칙에서 파라미터에서 dynamic타입이 있는 건, object타입이 있는것과 동일한 의미를 갖습니다. 즉 적합한 오버로드가 없을 때, 가장 나중에 선택이 되게 되겠죠.


- 대입형변환 A/S!

dynamic이 끼어있는 형변환 규칙도 약간의 변화가 있는데요, 그 규칙은 아래와 같습니다.

1. 모든 타입에서 dynamic타입으로 암시적 형변환이 가능하다. 기본적으로 object로 암시적 형변환이 가능한 타입이라면, dynamic으로도 암시적 형변환이 가능하다.

2. dynamic타입에서는 dynamic과 object를 제외한 다른 어떤 타입으로도 암시적 형변환이 불가능하다.

3. 하지만, 모든 '동적 표현식'은 다른 모든 타입으로 암시적 형변환이 가능하다.

4. 만약에 어떤 타입의 차이점이 dynamic과 object뿐이라면, 서로간에 암시적 형변환이 가능하다.

2, 3번에 대해서 좀 더 들여다 보면요, 타입의 형변환과 표현식의 형변환은 과연 뭐가 틀린걸까요? 일단 표현식의 형번환은 이때까지 '대입 형변환'이라고 불렀던 것을 가능하게 해줍니다. 예제를 하나 보면요.

string s = d;

이 형변환은 3번 규칙 때문에 성립합니다. 이 형변환은 동적 표현식에서 string으로의 형변환이지, dynamic타입에서 string으로의 형변환이 아니기 때문이죠. 이외에도 return, foreach, 프로퍼티에 값설정하기 등의 대부분의 경우는 이렇게 처리됩니다.

그렇다면 dynamic타입에서 string타입으로 형변환이 없어야 하는 이유는 뭘까요? covariance를 통해서 컴파일러가 이 형변환을 못하게 막는 걸 한번 확인해보겠습니다.

class C
{
    static void Main()
    {
        IEnumerable<dynamic> ied = null;
        IEnumerable<string> iei = null;
        var x = M(ied, iei);           
    }
    static T M<T>(IEnumerable<T> x, IEnumerable<T> y) { return default(T); } 
}

위 예제는 문제없이 컴파일 됩니다. 그리고 메서드의 타입유추 과정을 통해서 T를 dynamic이라고 골라내는 과정을 거칠텐데요, 그 과정은 아래와 같습니다.

1. 첫번째 매개변수는 IEnumerable<dynamic>이다. 그러므로 dynamic은 T의 후보가 된다.

2. 두번째 매개변수는 IEnumerable<string>이다. 그러므로 string은 T의 후보가 된다.

3. T의 후보군인 { dynamic, string }을 가지고 고민하는 과정에서 둘 사이의 관계를 보는데. string에서 dynamic으로의 형변환은 있지만, 그 반대는 성립하지 않는다. 그러므로 좀 더 일반적인 타입인 dynamic을 고르게 되는 것이다.

위 과정의 3번 단계에서 만약 dynamic에서 string으로 형변환이 가능했다면, 둘 중에 어떤 타입이 더 일반적인 타입인지를 결정할 수 없게 됩니다. 그렇다면 메서드 타입유추는 모호환 둘의 관계 때문에 실패하게 되겠죠. 그게 바로 dynamic에서 다른 타입으로의 형변환이 금지되어야 하는 이유입니다.

그리고 대입형변환이라는 용어는 아마 살아남지 못한 것 같습니다. C# 4.0 명세서에서 그 용어를 발견할 수 없었기 때문입니다. 그래도 혹시나 싶어서 Chris Burrows에게 질문을 남겨놨으니, 답이오면 반드시 알려드리겠습니다.


- 마치면서

앞서서 열심히 공부하고 적었던 내용이 바뀌고, 또 어떤 내용은 아예 통채로 날아가 버리니 아주 상쾌하네요~! 하하하-_- 그런데 바뀐 내용을 보니깐, 훨씬 간단하고 깔끔해지고, 더 이해하기 쉬워진 것 같아서 좋네요. 그럼 오늘은 여귀까쥐!


- 참고자료

1. http://blogs.msdn.com/cburrows/archive/2010/04/01/errata-dynamic-conversions-and-overload-resolution.aspx

Visual Studio Team Foundation Server 2010 설치 전 할일

Team Foundation Server 2010. 5. 3. 09:00 Posted by 알 수 없는 사용자

 

팀장 설득편 "VS TFS 2010" 이거 설치해봐1!!! - 설치 검토와  할일

 

반댈세 하는 팀장에게 드디어 설치를 보여줄 차례입니다. 사실 설치 전에 사전에 해야 하는 것은 다들 아시죠? 하드웨어의 준비입니다.

 

설치는 정말 단순합니다. 번째 설치하기 전에 설치 문서를 읽어 보면(아직 영문입니다 .) 설치 계정이나 환경에 대한 이야기가 있습니다. 여기서 설치 환경의 하드웨어 권장 사양을 확인합니다.

 

설치문서에 나온 권장 사양은 다음과 같습니다.

 

사용자

CPU

디스크

Memory

20 이하

1 개의 CPU

클럭 수 : 2.2 GHz

8 GB

2 GB

20 ~ 250 이하

1 개의CPU

클럭 수 : 2.6 GHz

230 GB

2 GB

250 ~ 450 이하

2 이상 CPU

클럭 수 : 2.8 GHz

500 GB

4 GB

450 ~ 2,200 이하

2 이상 CPU

클럭 수 : 2.8 GHz

31 GB ~ 136 GB

3.5 GB

2,200 ~ 3,600 이하

4 이상 CPU

클럭 수 : 2.2 GHz

31 GB ~ 136 GB

3.5 GB

 

정도 사양이면 현재 판매되고 있는 일반적인 서버라면 모두 괜찮다고 있지 않을까 합니다. Visual Source Safe 2005 대신해서 사용하기 위한 사양이라면   현재 사용하고 있는 서버라도 문제가 없다고 볼수 있습니다. 50 정도라 하여도 Disk 정도만 용량이 된다면 문제 없이 사용이 가능하죠. ^.^ 메모리는? 요즘 데스크탑도 4G 가는 중이라 서버에서 4G정도라면.. 문제가 없다고 있습니다.

 

이제 팀장에게 하드웨어는.. 쓰면 됩니다. 필요한 사항은 서버가 없다고 해도 된다고 하시면 됩니다.

 

그럼 이제 실제 설치에 필요한 계정은?

없습니다. 그냥 설치합니다.

 

설치 문서에는 계정에 대하여 설명이 되었습니다. Visual Source Safe 대신해서 사용할 분이라면

이계정은 그냥 넘어가셔도 됩니다. (추가 기능을 이용할 다시 계정을 설정할 있습니다.^^)

 

다시 팀장이 VS TFS 설치할 고생하던데? 특히 계정이 잘못되면 설치하고도 못쓴다는데? 괜찮겠게어?

 

답은 계정 설정은 필요없습니다.

       그냥 설치하면 ~ 이라는 것입니다.

 

이제 정말 설치 할일에 대하여 말해보겠습니다. 하드웨어는 준비되어 있다고 하면, 이제

 

당근 Windows 설치합니다. Windows Server 2003 SP2 / Windows Server 2003 R2 SP2

Windows Server 2008 / Windows Server 2008 R2

 

이렇게 지원합니다.

Windows Server 2003 에서는 Service pack 2 설치해야 하는 중요 포인트(?)입니다.

이제 Windows Server 2003 사용하는 곳도 있고 Windows Server 2008 사용하는 곳도 있을 겁니다.

 

요즘은 Windows Server 2008 R2 나오기 때문에 R2 기준으로 하겠습니다.

 

설치 전에 기본적으로 해주여야 하는것이 있습니다. 다른 것은 아닙니다.

.NET Framework 3.5 설치와 IIS(웹서버) 설치하시면 됩니다.

 

Windows Server 2008이상이라면 .NET Framework 3.5 이상이 이미 있기 때문에 별도 설치는 하지 않고 Windows에서 추가 기능 설치만 하시면 됩니다. IIS 서버도 마찬가지 입니다. 최신 서버인 Windows Server 2008 R2 64bit 지원하는데 이번 설치편은 Windows Server 2008 R2 에서 진행합니다.

(Windows Server 2008 32bit 에서도 똑같이 따라하시면 됩니다.^^)

[JumpToDX11-12] DirectCompute 의 절차.

DirectX 11 2010. 4. 26. 09:00 Posted by 알 수 없는 사용자


앞선 시간에서 우리는 GPGPU 의 실행에 대한 간단한 개념에 살펴보았습니다.
이제 실제적으로 GPGPU 를 활용하는 절차를 살펴볼 차례입니다.
큰 절차는 다음과 같습니다.


 

< DirectCompute 의 초기화 >

가장 먼저 DirectCompute 를 초기화 해야 합니다.
 

hr = D3D11CreateDevice

(

     NULL,     // default gfx adapter

  D3D_DRIVER_TYPE_HARDWARE,  // use hw

     NULL,               // not sw rasterizer

     uCreationFlags,     // Debug, Threaded, etc.

     NULL,               // feature levels

     0,                  // size of above

     D3D11_SDK_VERSION,  // SDK version

     ppDeviceOut,        // D3D Device

     &FeatureLevelOut,   // of actual device

     ppContextOut );     // subunit of device

);

어디서 많이 본 API 라고 생각이 드시죠.
DirectCompute 를 초기화하는 작업은 바로 전통적인 CreateDevice() API 를 사용하는 것입니다.
즉, DirectX 를 사용하는 것입니다.
이로 인해서 DirectX 는 더욱 더 넓은 범위에서 활용되어 질 것입니다.


< HLSL 의 로드 >

그 다음은 실제적으로 GPU 가 실행을 하게될 로직을 로드할 차례입니다.
이것은 워낙 다양할 수 있는 부분이기 때문에, 여기서는 간단하게 예를 들겠습니다.


#define BLOCK_SIZE 256

StructuredBuffer   gBuf1;
StructuredBuffer   gBuf2;
RWStructuredBuffer gBufOut;

[numthreads(BLOCK_SIZE,1,1)]
void VectorAdd( uint3 id: SV_DispatchThreadID )
{
  gBufOut[id] = gBuf1[id] + gBuf2[id];
}


보통 이를 두고 ComputeShader 라고 합니다.
ComputeShader 를 위한 여러종류의 버퍼가 존재합니다.
더 많은 종류의 버퍼는 차후에 설명드리기로 하겠습니다.

StructuredBuffer 라고 정의된 키워드는 C언어의 구조체와 같은 구조를 가집니다.
즉, 개발자가 정의한 구조체입니다.
그런데 앞에 식별자가 없으면 읽기 전용이라는 의미입니다.
반면에 앞에 'RW' 라고 명시된 버퍼는 읽기/쓰기 가 가능한 버퍼라는 의미입니다.
우리는 GPU 가 처리한 결과는 읽기/쓰기가 가능해야 하기 때문에,
결과를 저장하는 버퍼는 'RW" 가 명시되어 있습니다.
최적화를 위해서 각 목적에 맞게 버퍼를 사용해야 할 것입니다.^^


< ComputeShader 의 생성 >

pD3D->CreateComputeShader( pBlob->GetBufferPointer(),
                                             pBlob->GetBufferSize(),
                                             NULL,
                                             &pMyShader );  // hw fmt


CreateComputeShader() API 를 통해서 간단히 ComputeShader 를 생성할 수 있습니다.


< 입력을 위한 GPU 버퍼 만들기 >

우리가 GPGPU 를 활용하는 것은 CPU 를 활용하는 것보다 빠르게 결과를 도출하기 위해서입니다.
이를 위해서는 GPU 가 빠르게 액세스할 수 있는 버퍼가 있어야 할 것이며,
당연히 이것은 비디오 메모리에 존재해야 할 것입니다.
그래서 우리는 DirectX 인터페이스를 통해서 비디오 메모리를 생성을 합니다.


D3D11_BUFFER_DESC descBuf;
ZeroMemory( &descBuf, sizeof(descBuf) );
desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS;
desc.StructureByteStride = uElementSize;
desc.ByteWidth = uElementSize * uCount;
desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;

pD3D->CreateBuffer( &desc, pInput, ppBuffer );

주의해야 할 것은 바로 'BindFlags' 입니다.
'D3D11_BIND_UNORDERED_ACCESS' 라는 플래그를 주고 있습니다.
이것은 PixelShader 나 ComputeShader 에서 병렬적으로 실행하는 버퍼를 의미
합니다.


< 뷰를 만들자!! >

버퍼 리소스를 만들었으면, 이제 이를 실제 파이프라인에서 액세스할 수 있는 매커니즘을 만들어야 합니다.
즉, ShaderResourceView 를 만들어야 합니다.
DirectX10 부터는 아래와 같이 리소스들을 다루어야 합니다.



앞선 시간들을 통해서 View 라는 개념을 충분히(?) 숙지하셨을 것이라 생각합니다.^^
대체로 ShaderResourceView 는 파이프라인 스테이지에서 읽기 전용입니다.
그런데, 아래 UnorderedAccessView 는 양방향 화살표로 되어있습니다.
읽기/쓰기가 가능한 형태입니다.
이를 통해서 결과를 비디오 메모리에 있는 버퍼에 결과를 기록할 수 있음을 보여주고 있는 것입니다.


실제 API 를 통한 View 생성은 다음과 같습니다.

D3D11_UNORDERED_ACCESS_VIEW_DESC desc;
ZeroMemory( &desc, sizeof(desc) );
desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
desc.Buffer.FirstElement = 0;
desc.Format = DXGI_FORMAT_UNKNOWN;
desc.Buffer.NumElements = uCount;

pD3D->CreateUnorderedAccessView( pBuffer, // Buffer view is into
                                                      &desc,  // above data
                                                      &pMyUAV ); // result


중요한 부분은 ViewDimension 부분입니다.
'D3D11_UAV_DIMENSION_BUFFER' 를 설정하고 있는데,
이는 ComputeShader 상에서 이 버퍼를 일반적인 버퍼로 보겠다
는 의미입니다.
즉, 샘플링 작업을 전혀하지 않습니다. 
이는 어떠한 수정도 없이 데이터를 있는 그대로 보존합니다.


< 실행 단계 >

이제까지는 모두 준비 단계였습니다.
이제는 실제 실행 단계에 대해서 언급해 보겠습니다.

먼저, ComputeShader 를 현재 파이프라인 스테이지에 아래와 같이 바인딩 해주어야 합니다.
pD3D->CSSetShader( pMyShader, NULL, 0 );


그 다음에는 뷰를 바인딩해야 합니다.
pD3D->CSSetUnorderedAccessViews( 0,
                                                        1,
                                                       &pMyUAV,
                                                       NULL );


이제 마지막으로 GPU 에게 현재 바인딩된 내용을 바탕으로 연산해 줄 것을 요청합니다.
pD3D->Dispatch( GrpsX, GrpsY, GrpsZ );


이제 실행의 단계가 모두 끝났습니다.
이 단계까지 끝나면, 실행 결과가 비디오 메모리에 존재합니다.
우리가 결과를 확인하기 위해서는 CPU 가 액세스할 수 있는 버퍼로 결과를 복사
해야 합니다.


< 결과 복사해 오기 >

결과를 CPU 가 액세스 하기 위해서는 어떻게 해야 할까요?
이전 시간을 통해서 언급드렸듯이,
DX10 부터는 리소스에 대한 세부적인 액세스 권한에 대한 플래그를 설정할 수 있습니다.
그래서 다음과 같은 설정으로 버퍼를 만듭니다.

D3D11_BUFFER_DESC desc;
ZeroMemory( &desc, sizeof(desc) );
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
desc.Usage = D3D11_USAGE_STAGING;
desc.BindFlags = 0;
desc.MiscFlags = 0;
pD3D->CreateBuffer( &desc, NULL, &StagingBuf );


'D3D11_CPU_ACCESS_READ' 라는 플래그를 통해서,
이 버퍼는 CPU 가 액세스 할 수 있는 형태로 만듭니다.
그리고 'D3D11_USAGE_STAGING' 라는 플래그를 통해서
단순히 비디오 메모리에 있는 내용을
CPU 도 접근 할 수 있는 메모리로 복사해오는 버퍼임을 명시
합니다.


그리고 아래와 같이, 준비해둔 버퍼에 실제로 메모리를 복사해 옵니다.
pD3D->CopyResource( StagingBuf, pBuffer );

마침내 우리는 GPU 에 의해서 처리된 결과를 확인할 수 있게 되었습니다.


< 마치며...>

지금까지 DirectCompute 를 활용하는 일련의 절차에 대해서 살펴보았습니다.
DirectX11 의 API 가 생소해서 어려워 보일 수 있지만,
실제로 DirectCompute 의 절차는 그리 복잡하지는 않습니다.
현재 DirectCompute 의 활용은 SDK 샘플에 'NBodyGravity' 라는 이름으로 들어있습니다.
제가 여기에 대해서 자세히 언급드리면 좋겠지만,
그것은 차후로 미루기로 하겠습니다.^^


참고 자료
http://microsoftpdc.com/Sessions/P09-16
본 내용은 위의 PDC 를 참고해서 만들었습니다.

 

Visual Studio 2010! 나랑 놀아보자 – 기본편 (6회)

 

영상이 보이지 않으면 이곳을 클릭해서 실버라이트를 설치하세요

Generate from Usage 기능은 코드를 좀 더 빠르게 만들고, 디자인에 초점을 맞추어 코드를 만들 수 있도록 도와줍니다.

기존의 Visual Studio 에는 3rd Party 확장 기능을 설치하여 사용할 수 있었으나, 여러가지 리팩토링 기능이 많아 무겁게 동작하거나 답답한 경우가 있었습니다.

 

Generate from Usage 과 같은 세세한 배려가 Visual Studio 의 아쉬움을 채워주는 단비와도 같네요.

 

Visual Studio 2010 RTM 추가 완소 정보

Visual Studio 2010 2010. 4. 16. 12:00 Posted by POWERUMC

Visual Studio 2010 과 .NET Framework 4.0 트레이닝 키트

Visual Studio 2010 과 .NET Framework 4.0 트레이닝 키트를 다운로드 할 수 있습니다. 마이크로소프트는 Visual Studio 2010 CTP 버전부터 지속적으로 트레이닝 키트를 제공했습니다. 특히 고마운 것은 Visual Studio 2010 RTM 까지 이 트레이닝 킷의 업데이트를 소홀하지 않았다는 것입니다.

이 트레이닝 키트에는 PPT 파일, Hands-on Lab, 데모 소스 코드, 동영상이 포함이 되어있으며, 아래와 같은 범위의 내용이 포함이 되어있습니다.

  • C# 4
  • Visual Basic 10
  • F#
  • Parallel Extensions
  • Windows Communication Foundation
  • Windows Workflow
  • Windows Presentation Foundation
  • ASP.NET 4
  • Windows 7
  • Entity Framework
  • ADO.NET Data Services
  • Managed Extensibility Framework
  • Visual Studio Team System

다운로드
http://www.microsoft.com/downloads/details.aspx?FamilyID=752CB725-969B-4732-A383-ED5740F02E93&displaylang=en

   

   

Visual Studio 2010 과 .NET Framework 4.0 트레이닝 코스 (Channel 9)

MSDN 의 Channel 9 사이트는 동영상으로 콘텐트를 제공하는 사이트입니다. 물론 Visual Studio 2010 과 관련된 동영상 콘텐트들이 상당히 많이 준비가 되어있습니다.

아래의 Channel 9 사이트에는 C# 4.0, Visual Basic 10, F#, Parallel Computing Platform, WCF, WF, WPF, ASP.NET AJAX 4.0, ASP.NET MVC Dynamic Data 등이 포함되어 있습니다.

Visual Studio 2010 Channel 9 사이트
http://channel9.msdn.com/learn/courses/vs2010/

   

   

Channel 9 Shows

Channel 9 Show 사이트는 좀더 심도 있는 내용의 볼거리를 제공하는 사이트 입니다.

Channel 9 Shows 사이트
http://channel9.msdn.com/shows/

여러가지 카테고리를 제공하고 있는데 특히 10-4 카테고리에는 팟케스트(Podcast) 로 시리즈로 동영상을 제공하며 심도 있게 다루는 내용이 많습니다.    

Channel 9 Shows 사이트의 10-4 카테고리 (강추)
http://channel9.msdn.com/shows/10-4/

 

영상이 보이지 않으면 이곳을 클릭해서 실버라이트를 설치하세요

Visual Studio 2010 출시 몇 시간 만에 Visual Studio 2010 e-book 이 나왔습니다.

 

내용 전체가 포함된 것이 아니라, PREVIEW CONTENT 만 포함되어 있습니다. 하지만 내용상으로 기초적인 내용에서 약간의 중급적인 내용이 포함이 되어있어 한번씩 보시면 도움이 될 것 같습니다.

아직 책이 완성본은 아닙니다. 아마도 예정대로라면 2010년 여름쯤이면 책의 모든 콘텐트가 업데이트 될 것 같습니다.

Moving to Visual Studio 2010 e-book 
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=560a5365-5c62-488a-91ed-a779e0e33ac4 

Visual Studio 2010 출시에 따른 SharePoint Developer Tools

SharePoint 2010 2010. 4. 14. 09:00 Posted by 알 수 없는 사용자

결론은 그다지 큰 변화는 없습니다. (VS 2010, SharePoint 2010 RC 한글로 테스트했습니다.)

 

프로젝트 템플릿이 추가될 예정이지만 출시 버전에는 예전과 동일합니다. 이전 버전의 화면은 생략하겠습니다.


프로젝트 항목들도 크게 바뀐 것은 없지만 Workflow Association Form, Workflow Initiation Form이 빠져버렸습니다. 좀 지켜봐야 할 것 같습니다.


일반 웹 파트 소스 코드는 기존에는 클래스의 생성자와 CreateChildControls, RenderContents 메서드가 있었고 base 메서드를 호출해주었는데 출시 버전에서는 달랑 CreateChildControls 메서드만 아래 그림처럼 제공해줍니다.



SharePoint Explorer 의 모습도 변화 없다는 것을 확인할 수 있습니다.

RC 버전에서 본격적으로 준비를 해야 하지 않나 생각됩니다.

 출시도 되었으니 계속 블로깅 하도록 하겠습니다.






 

'SharePoint 2010' 카테고리의 다른 글

Client Object Model - .NET  (1) 2010.05.14
SharePoint 2010 LINQ to SharePoint  (1) 2010.05.12
SharePoint 2010 Server Object Model  (0) 2010.02.12
SharePoint 2010 데이터 기술  (0) 2010.02.11
SharePoint 2010 Event Receiver  (0) 2010.02.10

Visual Studio 2010 공식 팀 블로그의 트위터

안녕하세요. Visual Studio 2010 공식 팀 블로그에서는 트위터를 통해 여러분들과 소통을 하고 있습니다.

   

Visual Studio 2010 Launch Live 를 트위터로 생중계

VS2010 팀의 트위터를 통해 라스베가스의 Bellagio Hotel 에서 생방송으로 진행된 Visual Studio 2010 Launch Live 를 생중계 하였습니다. Visual Studio 2010 Launch Live 는 아래의 링크에서 다시 볼 수 있습니다.

http://www.microsoft.com/presspass/presskits/developer/videogallery.aspx?contentID=devlaunch10_d1keynote

   

트위터의 #vs2010korea 해시태그 커뮤니케이션 오픈

한국에서 Visual Studio 2010 을 사용하는 사람들을 위한 태그입니다. 여러분이 어디에 있든, 무엇을 하든, #vs2010korea 는 여러분들의 이야기에 듣고 있습니다. ^^

Visual Studio 2010 의 질문/답변/팁/노하우/잡담/구매/이슈 등 여러분들의 이야기를 #vs2010korea 라는 하나의 태그로 묶고 싶습니다.

   

   

많은 참여 바랍니다.

드디어 Visual Studio 2010 이 출시가 되었습니다. Subscribe to MSDN 을 통해 다운로드 할 수 있습니다.

다운로드
https://msdn.microsoft.com/ko-kr/subscriptions/securedownloads/default.aspx

   

 

초기 Visual Studio CTP 와 Beta 버전에서 많은 논란이 있었습니다. 하지만 Visual Studio 개발팀의 많은 노력과 결실이 Visual Studio RC 에서 상당수가 개선이 되었습니다.    

  

이번 메이저 업그레이드 버전에서 많은 사용자의 피드백을 통해 많은 버그 들이 수정이 되었답니다. 얼마나 많은 사용자가 참여를 했고, Fixed 버전이 나왔는지 아래의 Microsoft Connect 사이트를 통해 확인할 수 있습니다.

https://connect.microsoft.com/VisualStudio

   

또한, 저희 Visual Studio 2010 에서 팀원을 추가로 모집하고 있습니다. 관심있는 분들은 아래의 링크를 참고하세요.

http://vsts2010.net/248

   

저희 팀 블로그는 트위터를 운영하고 있습니다. 빠른 소식을 전달해 드리고, 커뮤니케이션의 장을 열어드릴 것입니다.

자 그럼 Visual Studio 2010 의 세계로 떠나봅시다. 아직 잘 모르시겠다고요?? 그럼 아래의 저희 Visual Studio 2010 의 블로그 포스트를 차근 차근 살펴보시기 바랍니다.

 

Visual Studio 2010
Visual Studio 2010
Visual Studio 2010! 나랑 놀아보자 – 기본편 (4회) - Call Hierarchy
Visual Studio 2010! 나랑 놀아보자 – 기본편 (3회) - Box Selection
Visual Studio 2010! 나랑 놀아보자 – 기본편 (2회) - VS IDE
윈도우폰 7 개발환경 공개
실버라이트4 RC와 블렌드 4 베타 공개
똑똑한 검색을 지원하는 VSTS 2010의 "Navigate To" 검색
C#에서 IntelliSense가 동작하지 않을 때 문제 해결 방법
Visual Studio 2010 RC 공개
Visual Studio 2010 RC 공개 임박!
VS 2010 기능소개 05 - Visual C#&VB 개발자 IDE Tips & Tricks 두번째
VS 2010 기능소개 04 - Visual C#&VB 개발자 IDE Tips & Tricks 첫번째
VS 2010 기능 소개 03 - IDE의 변화
VS 2010 기능 소개 02 - IDE의 기능 추가
Visual Studio 2010 출시 일정
VS 2010 기능 소개 01 인텔리 센스 기능의 변화
Visual Studio 2010과 Blend Preview for .NET 4 통합 문제
VS2010 베타2의 WPF & Silverlight 디자이너 성능 향상 팁
VS 2010 Beta 2 설치 과정에서 Silverlight SDK 문제
Visual Studio 2010 Beta 2 설치 미리 보기
Visual Studio 2010 Beta 2 출시
멀티 모니터 사용
Visual Studio 2010 Beta 1 설치부터 살펴보기
Visual Studio 2010 & .NET 4.0 참고 자료들
Visual Studio 2010 내부 빌드 최신 동영상: C# 4.0 Language + IDE + WPF Shell + Editor
Visual Studio 2010 의 특징

Visual Studio Extensibility
Visual Studio 2010 확장 모델인 VSIX 버그
[VSX] 1. Visual Studio Extensibility,, 그 시작
MousePresentationTracker - MEF 세미나 예제
[VSIX] 2-2. How to start VSIX programming
[VSIX] 2-1. How to start VSIX programming
[VSIX] 1. What is different from before version?
Visual Studio 2010 Extension Manager
Visual Studio 2010 SDK 와 Readme
[Blueprints] S+S Blueprints

 

Language
C#
[C# 4.0] Generic Covariance And Contra Variance
[C# 4.0] New Extension Method "Zip"
[C# 4.0] Duck Typing
[C# 4.0] Named and Optional Parameters
Welcome to Dynamic C#(14) - 철지난 만우절에 낚여서 파닥파닥.
Welcome to Dynamic C#(13) - 아직도 가야할 길.
Welcome to Dynamic C#(12) - dynamic은 외로운 아이.
Welcome to Dynamic C#(11) - The Phantom of The Dynamic
Welcome to Dynamic C#(10) - Dynamic Returns Again.(2)
Welcome to Dynamic C#(9) - Dynamic Returns Again.
Welcome to Dynamic C#(8) - DLR이 나무를 사랑하는 이유
Welcome to Dynamic C#(7) - 아낌없이 표현해 주는 나무
Welcome to Dynamic C#(6) - Return to Dynamic (2)
Welcome to Dynamic C#(5) - Return to Dynamic.
Welcome to Dynamic C#(4) - 극과극 비교체험.
Welcome to Dynamic C#(3) - 마음이 넒어진 C#
Welcome to Dynamic C#(2) - Wanna be a polyglot.
Welcome to Dynamic C#(1) - 첫만남.
Welcome to dynamic C# 외전(3) - 감시하는 자와 감시당하는 자.
Welcome to dynamic C# 외전(2) - Generic Method.
Welcome to dynamic C# 외전(1) - Generate From Usage.

CLR (Common Language Runtime)
8. System.Object (2)
7. System.Object
6. Assembly - GAC(Global Assembly Cache)
5. Assembly - Strongly named assemblies
4. Assembly
3. MSCorLib & Metadata
2. CLR! CLR! CLR!
1. Hello 世界

F#
Welcome to F#(12) - 공동작업 좋치아니항가
Welcome to F#(11) - 차별을 권장하는 언어인거임?!?!
Welcome to F#(10) - 인도음식 카레.....?
Welcome to F#(9) - 메이져 데뷰.
Welcome to F#(8) - 은총알과 엄친아.
Welcome to F#(7) - 클리프 행어.
Welcome to F#(6) - 비교본능.
Welcome to F#(5) - 아주 조금씩 심화되는 탐색전.
Welcome to F#(4) - 과거와 배경을 좀 더 알고싶어.
Welcome to F#(3) - 사소한 탐색전.
Welcome to F#(2) - 두번째 만남.
Welcome to F#(1) - 첫만남.    

C++0x
[VC++] 14. decltype
[VC++] 13. Lambda - 네 번째
[VC++] 12. Lambda - 세 번째
[VC++] 11. Lambda - 두 번째
[VC++] 9. Lambda ( 람다 ) - 첫 번째
[VC++] 8. 우측 값 참조( RValue Reference ) – 다섯 번째
[VC++] 7. 우측 값 참조( RValue Reference ) - 네 번째
[VC++] 6. 우측 값 참조( RValue Reference ) - 세 번째
[VC++] 5. 우측 값 참조( RValue Reference ) – 두 번째
[VC++] 4. 우측 값 참조( RValue Reference ) - 첫 번째
[VC++] 3. static_assert
[VC++] 2. C++0x의 auto
[VC++] 1. 큰 변화가 기대되는 Visual C++( VC++ )
VC++ 10에 구현된 C++0x의 코어 언어 기능들
nullptr
대용량 파일 조작을 위한 C++0x의 변화

C++0x Parallel Programming
C++ 개발자를 위한 병렬 프로그래밍 동영상 [6/7] 완결!
C++ 개발자를 위한 병렬 프로그래밍 동영상 [5]
C++ 개발자를 위한 병렬 프로그래밍 동영상 [4]
C++ 개발자를 위한 병렬 프로그래밍 동영상 [3]
C++ 개발자를 위한 병렬 프로그래밍 동영상 [2]
C++ 개발자를 위한 병렬 프로그래밍 동영상 [1]
C++ 개발자를 위한 병렬 프로그래밍 동영상 [0]
양보할 줄 아는 Concurrency Runtime의 event
Parallel Patterns Library (PPL)
Concurrency Runtime
인사 및 Multi Core, Multi Thread...그리고 VC++ 10
PPL task를 이용한 피보나치 수 계산
Parallel Patterns Library(PPL) - concurrent_queue - 2
Parallel Patterns Library(PPL) - concurrent_queue - 1
Parallel Patterns Library(PPL) - concurrent_vector - 2
Parallel Patterns Library(PPL) - concurrent_vector - 1
Parallel Patterns Library(PPL) - parallel_for_each 알고리즘
Parallel Patterns Library(PPL) - parallel_for 알고리즘
Parallel Patterns Library(PPL) - 병렬 알고리즘
Parallel Patterns Library(PPL) - Task
Parallel Patterns Library(PPL) - combinable
Parallel Patterns Library(PPL) - parallel_invoke
Parallel Patterns Library(PPL) - task group에서의 병렬 작업 취소 - 2
Parallel Patterns Library(PPL) - task group에서의 병렬 작업 취소 - 1
Asynchronous Agents Library로 Dining Philosophers 문제 해결하기 - 마지막회
Asynchronous Agents Library로 Dining Philosophers 문제 해결하기 - 2
Asynchronous Agents Library로 Dining Philosophers 문제 해결하기 - 1 

Visual C++ 10
2010/02/04 디버깅 모드에서 역어셈블리 코드 보기
2009/10/15 About Visual C++ 10    

MFC
[MFC] 태스크 대화상자(Task Dialog) - 예제 코드 올립니다.
[MFC] 태스크 대화상자(Task Dialog) - (3/3) : 활용하기
[MFC] 태스크 대화상자(Task Dialog) - (2/3) : 사용하기
[MFC] 태스크 대화상자(Task Dialog) - (1/3) : 기능 소개
[MFC] 리스타트 매니저(Restart Manager) - (3/3) : 활용하기
[MFC] 리스타트 매니저(Restart Manager) - (2/3) : 사용하기
[MFC] 리스타트 매니저(Restart Manager) - (1/3) : 기능 소개

   

.NET Framework
Parallel Programming
Welcome to Parellel world(1) - Here comes a new challenger!
[C# 4.0] Parallel Extension - [3] TPL(Task Parallel Library)
[C# 4.0] Parallel Extension - [2] 병렬 처리 아키텍처
[C# 4.0] Parallel Extension - [1] 병렬 처리

Managed Extensibility Framework
MEFGeneric 코드 플랙스에 공개합니다.
MEF 에 Generic Type 을 지원하기 위해서..?
MEF 는 Generic Type 을 지원하지 않는다!
MEF Preview 6 공개
[MEF] 10. Querying the CompositionContainer
[MEF] 9. Recomposition
[MEF] 8. Strongly Typed Metadata
[MEF] 7. Exports and Metadata
[MEF] 6. Lazy Exports
[MEF] 5. Catalog 사용
[MEF] 4. Import 선언
[MEF] 3. Export 선언
[MEF] 2. Parts 와 Contracts 선언
[MEF] 1. Managed Extensibility Framework 이란?

WCF
WCF 서비스의 동시성(Concurrency) - 2
WCF 서비스의 동시성(Concurrency) - 1
WCF의 기본 <Contract> - Data Contract
WCF의 기본 <Contract> - Service Contract
기본 WCF 프로그래밍 - 첫 WCF 서비스 만들기 2
기본 WCF 프로그래밍 - 첫 WCF 서비스 만들기
WCF란 무엇인가?

 

Web Development
ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Web Forms(1)
ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - New Features in the Microsoft Ajax Library
ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Core Services
ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Web Designer & Deployment
ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Dynamic Data(2)

ASP.NET 4 와 Visual Studio 2010 Web Development Beta 2 Overview - Dynamic Data(1)
[ASP.NET 4.0] 2. AJAX - Declarative Client Template Rendering
[ASP.NET 4.0] 1. Core Service - Extensible Output Caching    

M, V 그리고 C의 각방생활(3) - 초간단 사이트 만들기(1)
M, V 그리고 C의 각방생활(2) - ASP.NET MVC와 인사나누기
M, V 그리고 C의 각방생활(1) - ASP.NET MVC vs ASP.NET WEB FORM    

   

Cloud Development
[MS@클라우드컨퍼런스] MS 클라우드 기술과 플랫폼
SQL Azure 알아보기 (5)- SQL Azure 이점과 T-SQL 지원
SQL Azure 알아보기(4) – SQL Azure Cloud App
SQL Azure 알아보기(3) –SQL Server 2008 R2 Nov CTP
SQL Azure 사용 시 주의점(1) - 방화벽 설정
구름 속의 미래 : Windows® Azure™ Platform [2]
SQL Azure 알아보기(2) – 데이터베이스 스키마 마이그레이션, 데이터 전송
SQL Azure 알아보기 (1) - 데이터베이스 개체 생성
SQL Azure - CTP1
구름 속의 미래 : Windows® Azure™ Platform [1]

   

Windows 7 Development
[멀티터치]멀티터치 프로그래밍 환경 구축하기
사람이 기계와 만나는 진정한 방법 - 멀티터치
[Windows7] Win32를 이용해 윈도우7 멀티터치 프로그래밍하기
Windows 7을 위한 Windows XP 모드
Windows SDK 설치 후 XAML 인텔리센스 문제

 

Sharepoint 2010
SharePoint 2010 Server Object Model
SharePoint 2010 데이터 기술
SharePoint 2010 Event Receiver
SharePoint 2010 Feature
SharePoint 2010 Visual Web Part
SharePoint 2010 Web Part 생성
SharePoint 2010 개발 환경- Hello World 웹 파트 생성 및 배포하기
SharePoint 2010 개발 환경 구성
SharePoint 2010 Overview

   

Architecture Development
Windows Server AppFabric - Velocity 란?
몽당연필과 함께 하는 VSTS 2010 모델링 1/4
몽당연필과 함께하는 VSTS 2010 모델링 0/4
Architect Development ?

   

Agile Development
애자일에 대한 고찰
[Better Code]Visual Studio Code Analysis Enhancements - 3. Data Flow Rules and Phoenix Engine
[Testing] Moq.NET (T/B Driven Development)

[Testing] BDD (Behavior-Driven Development–행위 주도 개발)
[Testing] TDD (Test-Driven Development-테스트 주도 개발)
[Better Code]Visualize Code Relationships
[Better Code]PEX, Automated Whitebox Testing for .NET - 1. 개요
[Better Code]Visual Studio 2010 Code Analysis Enhancements - 2. Rule Sets Feature
[Better Code]Visual Studio 2010 Code Analysis Enhancements - 1.개요
[Better Code]TDD의 개념이 완벽히 녹아 들어간 VSTS 2010

   

Team Foundation Server
Team Foundation 트러블 슈팅 가이드
Visual Studio 2010을 활용한 ALM (1-5) - ALM 이란 무엇인가
TFS 2010 설치 과정 중에 TF255040 문제
TFS 2010 Build Service 설치
TFS 2010 설치 하기

VC++ 10에 구현된 C++0x의 코어 언어 기능들

C++0x 2010. 4. 12. 08:30 Posted by 알 수 없는 사용자

Visual C++ 팀 블로그에 C++0x Core Language Features In VC10: The Table라는 이름으로 C++0x의 기능 중 코어 언어와 관련된 것 중에서 VC++ 10에 구현된 것들을 테이블 표로 정리되어 있습니다.

GCC C++0x 구현 항목 테이블 표 형식을 차용했다고 하네요.


 

 

위의 테이블 표에서는 C++0x가 처음 구현된 VC++9VC++ 10을 비교하고 있습니다.

 

그리고 글의 마지막에 작년에 Boost Con(Boost 라이브러리 관련 행사)에서 발표한 자료가 첨부 파일로 있습니다. 이 문서를 보면 VC++ 10에서 구현한 C++0x의 코어 언어 기능들을 설명하고 있습니다.

 

문서를 보니 큰 기능들은 제가 작년부터 공부하면서 저희 팀 블로그나 여러 장소에서 설명 하였지만 일부 기능은 저도 미쳐 파악 하지 못한 것들도 있더군요. 앞으로 이런 빠진 부분에 대해서 팀 블로그를 통해서 설명해 드리겠습니다.^^


 

'C++0x' 카테고리의 다른 글

[Plus C++0x] 람다(Lambda) 이야기 (2)  (1) 2010.05.27
[Plus C++0x] 람다(Lambda) 이야기 (1)  (0) 2010.05.27
"Visual C++ 10과 C++0x" pdf 파일  (4) 2010.04.20
C++0x 관련 책 "Visual C++ 10과 C++0x"  (9) 2010.04.17
nullptr  (2) 2010.01.28

Visual Studio 2010! 나랑 놀아보자 – 기본편 (4회)

 

영상이 보이지 않으면 이곳을 클릭해서 실버라이트를 설치하세요

Call Hierarchy 기능은 코드의 흐름을 파악하기 위한 유용한 기능입니다.
이제는 코드의 흐름을 파악하기 위해 이곳 저곳으로 찾아다니면서 분석할 필요가 없습니다.
Call Hierarchy 기능은 코드를 보지 않고도, 코드의 연관 관계를 추적할 수 있기 때문입니다.
특히 Interface Programming 에서 빠져서는 안될 유용한 기능 중에 하나입니다.

Visual Studio 2010! 나랑 놀아보자 – 기본편 (3회)

 

영상이 보이지 않으면 이곳을 클릭해서 실버라이트를 설치하세요

반복적인 코드를 만들기 위해, Copy&Paste 는 매우 유용한 기능입니다.
특히 Box Selection 기능은 예전부터 가끔씩 사용하던 기능이지만, 일부 편리하게 사용하기는 쉽지 않았습니다.

Visual Studio 2010 은 Box Selection 기능은 '선택 영역 글자 삽입'과 '0(Zero) 길이 지원' 으로 좀 더 편리하게 사용할 수 있습니다.

Visual Studio 2010! 나랑 놀아보자 – 기본편 (2회)

 

영상이 보이지 않으면 이곳을 클릭해서 실버라이트를 설치하세

Visual Studio 2010 의 코드 에디터는 WPF 가 적용되어 시각적인 효과를 표현할 수 있습니다.
그리고 멀티 모니터를 지원하게 되어, 사용자가 여러 개의 모니터를 이용하여 코드를 개발하기가 수월해 졌습니다.

코드 에디터가 어떻게 변화하였는지 살펴보도록 하겠습니다.