Search

'분류 전체보기'에 해당되는 글 671건

  1. 2012.09.11 Windows 8 스타일 앱 개발에 대한 고찰
  2. 2012.08.21 [ VC11-C++11 ] range base for - 1 3
  3. 2012.08.14 [ VC11-C++11 ] chrono - clock 클래스 1
  4. 2012.08.07 [ VC11-C++11 ] chrono - 시간 계산
  5. 2012.08.02 [월간 마이크로소프트 5월호 특집기사] Windows 8 시대를 준비하는 Visual Studio 2012를 마치며
  6. 2012.08.02 [월간 마이크로소프트 5월호 특집기사] C++ 매트로 앱 개발을 위한 C++/CX 언어
  7. 2012.08.02 [월간 마이크로소프트 5월호 특집기사] Windows 8 시대를 준비하는 Visual Studio 2012
  8. 2012.07.31 [ VC11-C++11 ] chrono - 시간 측정하기
  9. 2012.07.23 [ VC11-C++11 ] enum - 전방선언
  10. 2012.07.16 [ VC11-C++11 ] enum - unscoped enumeration과 scoped enumeration
  11. 2012.07.09 [ VC11 ] 메모리를 절약하는 VC++11의 STL 컨테이너
  12. 2012.06.25 [ VC11 ] 대격변(?) Visual C++ 11 3
  13. 2012.05.07 크로스 플랫폼 개발 환경 만들기 - (8/11) Mono 개발 환경 만들기 5
  14. 2012.05.07 크로스 플랫폼 개발 환경 만들기 - (7/11) 우분투 OS를 개발자 스타일로 최적화
  15. 2012.05.04 크로스 플랫폼 개발 환경 만들기 - (6/11) 윈도우 Active Directory 가입
  16. 2012.05.04 크로스 플랫폼 개발 환경 만들기 - (5/11) 한글 입력 문제 1
  17. 2012.05.04 크로스 플랫폼 개발 환경 만들기 - (4/11) 한글 업데이트
  18. 2012.05.04 크로스 플랫폼 개발 환경 만들기 - (3/11) 기본 구성
  19. 2012.05.04 크로스 플랫폼 개발 환경 만들기 - (2/11) 우분투 12 설치 1
  20. 2012.05.03 크로스 플랫폼 개발 환경 만들기 - (1/11) 도전하라 개발자여 9

Windows 8 스타일  개발이 한창 유행이다물론 모바일 생태계 전반전인 유행은 아니더라도 Microsoft 기술을 하는 사람들에게는  관심 대상이다. Windows 8 운영체제가 탑재되는 테블릿도 출시가 되고, New iPad 보다 하드웨어 스팩이  좋은 테블릿 출시도 준비중인 곳이 많다고 들었다새로운 마켓이 열리는 만큼 테블릿 사용자에게는 새로운 재미를 선사해줄 것은 분명한 사실일 것이다.

Windows 8 스타일 개발을 위해  가지 알아야  구조적인 개념이나 유의사항 정도만 언급하기 위해 글을 나간다. C++/CX, C#,VB XAML(eXtensible Application Markup Language)  이용하여 WPF 데스크탑 응용 프로그램처럼 프로그래밍을   있다그리고 HTML/JavaScript 조합으로  개발 환경과 유사하게 개발을   있다.아마 대부분의 Windows 8 스타일  개발자라면 알고 있는 내용일 것이다그리나  포스팅에서는 C++/CX C#개발 언어를 기준으로 아티클 내용을 채울 것이다.

 

Windows 8 스타일  런타임 관점의 구조

[이미지 링크]

   

WinRT(Windows Runtime) 플랫폼의 구조적 아키텍처 이미지이다기존 Windows Desktop 응용 프로그램 환경과다른점은 WinRT APIs  중간에 끼어있다 WinRT  Windows 8 스타일 앱의 핵심이며, Windows  시작하는Namespace 모두 WinRT 이다.

C#,VB 개발 환경은 그나마 편리한 Library Subset  제공한다. .NET Framework 최소화 버전이라고 보면 된다.이를 .NET for Windows Store apps 이라고 부르며위의 이미지에는  내용이 빠져있다.

C++/CX  잘라 .NET for Windows Stores apps 제공되지 않는다. .NET 개발자라면 System(mscorlib.dll) 으로 시작하는 Namespace  얼마만큼 편한지 알텐데 Library Subset 제공되지 않으니 다른 방법을 사용해야한다쉬운 예로 HttpClient 같은 클래스도 C++/CX MsXml COM 컴포넌트를 이용하는 편이 낫다그렇다고 모든C++ 라이브러리를 사용할  있는 것도 아니다. 이 부분에서 특히 라이브러리의 제한이 있으므로 C:\Program Files (x86)\Windows Kits\8.0\Include\shared 폴더에서 사용가능한 Header 파일을 확인해보도록 하자.

만약 Header 파일의 pragma 선언이 Dektop Family 라면 Windows 8 스타일 앱에서는 사용할  없는 라이브러리이며상당한 Header들이 Desktop Family 속하여당장 .NET for Windows Stores apps 만큼 쓸만한 클래스들이 없다는 것이 조금 슬프다다만좋은 소식이라면 C++ boost Library 등이 C++/CX 용으로 컨버전을 시도하는 분들이많으므로조금만 기다려보면 쓸만한 라이브러리들이 대거 출연할 것으로 보인다.

   

더불어 C#, C++ 개발자들도 알고 있어야 하는  중에 하나가 WinRT COM 컴포넌트 기반의 라이브러리라는 것쯤은 들어보았을 것이다그래서 Windows 8 스타일  개발자들은 COM 대한 개념과  나아가 이를 구현할 있다면  좋다특히 C#, VB 에서 WinRT 컴포넌트를 만드는 것은  가지 지켜야할 제약이 있으므로 다음의 링크를  참고하는 것이 좋다.

C#  Visual Basic으로 Windows Runtime 구성 요소 만들기 http://msdn.microsoft.com/ko-kr/library/windows/apps/br230301.aspx

   

대신 C++/CX WinRT 컴포넌트를 만드는 것이 오히려  간단하다앞서 말했다시피 WinRT COM 컴포넌트 기반이지만기존 C++ 에서 COM 컴포넌트를 만드는 만큼 어렵지가 않다. C++ COM 구현의 첫번째는 IUnknown 인터페이스를 구현하는 것이지만, WinRT 에서는 Iunknown을 상속하는 IInspectable 인터페이스가 더 중요하다.IInspectable 인터페이스는 C++/CX 개발된 응용 프로그램이 런타임  해당 클래스의 정보를 제공하기 위한 인터페이스이다물론 기존 C++ 에서도 런타임상 클래스 정보가 필요하여 이를 직접 구현하는 방법도 있다하지만C++/CX IInspectable 인터페이스는 C++/CX 컴파일 과정에서 자동으로 구현을 해준다이는  IUnknown 인터페이스까지 자동으로 구현해준다고 보면 된다그렇기 때문에 Iunknown 인터페이스의 AddRef, Release 메서드에 대한 객체 수명주기를 WeakReference 클래스를 통해 위임할  있다. WeakReference 통해 금방 해제될  있는컴포넌트를 가비지 컬렉터 대상이 되도록 지정한다그러므로 사용 빈도가 매우 많고매번 자원 해제에 대한 비용이반복되는 것은 WeakReference 효과적으로 객체 수명 주기를 다룰  있게 한다이러한 C++/CX 특별히 제공되는 라이브러리는 Microsoft.WRL Namespace 포함되어 있다.

아직 이러한 개념적인 부분이 어렵게 느껴진다면 월간 마이크로소프트 5월호 특집 기사로 기고한 필자의 다음의 글부터 참고 바란다.

[월간 마이크로소프트 5월호 특집기사] C++ 매트로  개발을 위한 C++/CX 언어http://blog.powerumc.kr/378

   

   

Windows 8 스타일  응용 프로그램 관점

짧게 말해 Windows 8 스타일  개발은 쉽다. Visual Studio 2012에서 훌륭하게 대부분이 구현된 템플릿을 제공하기 때문에메서드 중간 중간 원하는 기능을 추가하고클래스나 XAML  만들면 된다다만이는 만든다는 것이 쉽다는 것이지 응용 프로그램 구조적인 측면에서는 전혀 쉽지 않다.

먼저 알아야  것이, Windows 8 스타일  페이지를 상태 관리  것인지 것인지부터 결정해야 한다상태 관리를 유지할 필요가 없다는 것은  개발(ASP.NET/ASP/PHP/JSP)  같은 서버 사이드 개발 환경과 유사하다특히 IIS에서부터 ASP.NET까지 연결되는 Application Pipeline 매번의 Request마다 Pooling Thread 활성화되어서버 랜더링을 통해 사용자에게 HTML Response 전달이 된다.

   

1. 상태 관리를 개별적으로 유지하고 싶다면

다음의  가지 메서드를 재정의하면 된다ASP.NET Custom Control 구현해 보았다면 VIEWSTATE 상태 유지를 위해 이런 유사한 코드를 구현해야 하는 것을  것이다.

   

Frame.Navigate 메서드는 Page Type 인자로 받고매번 새로운 인스턴스를 생성한다. (구현을 다르게 한다면 인스턴스를 이용하도록  수도 있다.) 페이지의 상태 유지야 위의 메서드를 재정의하는 정도로 끝낼  있지만페이지에 포함된 UserControl 있다면 상황은 달라진다독자마다 구현하는 방법은 다르겠지만효과적으로 상태를 관리하기 위해 UserControl 조금 귀찮아지는 존재이다인스턴스의 재사용을 위해 자주 사용하는 UserControl 대한 상태 관리를 고민해야 하다니… (현재 아티클은  내용이 대해 오픈 소스 제공으로 효과적인 방법을 제안하도록필자는 약속 하겠다.)

   

2. 상태 관리를 자동으로 캐싱하고 싶다면

상태 관리를 자동으로 캐싱하는 방법도 매우 쉽다. Page.NavigationCacheMode 프로퍼티를 Enabled 해주면 된다.물론 XAML 코드에 속성을 추가해도 된다하지만 아쉽게도 Frame.Navigate 메서드를 통해 자동으로 상태 관리를 하도록  Page 새로운 인스턴스가 생성이 된다상태 관리 캐싱에 대한 조건은 GoBack(), GoFoward()  같은Frame 이동에 대해서만 유효하다조금  이해할  없는 부분은 Page 포함된 UserControl  상태 관리 캐싱 대상에서 제외된다. (물론가능하도록   있지만 개념적으로  깊게 이해하고 구현해야 한다.)

   

3. 남발되는 async/await 의한 동기화 문제

Windows 8 스타일 앱을 사용하다가 자주 멈짓 멈짓 한다면 분명 사용자는 짜증날 것이다때문에 async / await 키워드를 더욱 자주 사용하는 편이다그렇기 때문에 UI 상태에 대한 비동기와 컴포넌트나 인스턴스 메서드 호출에 대한 비동기  모두 정확하게 Threading  대한 지식이 필요하고자유 자재로 Threading  다룰  있다면 더욱좋다. Windows 8 스타일 앱에서 가장 많이 발생하는 Threading 문제는 Thread 실행  인스턴스 해제에 대한 동기화와 Thread Cancel  대한 동기화다.

 문제를  피하기 위해서는 클래스나 라이브러리를 만들때 부터 async / await  대한 고려가 필요하다쉽게 이야기하자면 자주 쓰지 않는 편이 좋고써야  곳에 써야 한다.

   

이를  판단하려면 Thread 동기화에 대해 적어도  가지는 반드시 익히는 것이 좋다. MSDN  아래의 글들을 번정도  필독하기 바란다.

관리되는 스레딩 기본 사항 http://msdn.microsoft.com/ko-kr/library/hyz69czz 
스레딩(C#  Visual Basic) http://msdn.microsoft.com/ko-kr/library/ms173178(v=vs.110)

   

      

Windows 8 스타일  배포와 라이브러리 배포 문제

 부분은 매우 민감한 부분이고 조심스럽다실제 Windows App Store에서 테스트할  없을 뿐더러 개발 환경에서발생하는 문제이므로실제 Windows App Store  통해 발생할 수도 있을 가능성이 있을  같다. COM 기반 라이브러리나 DLL 구성 요소 등은 공유 메모리에 로드가 된다는 것을  것이다특히  부분은 COM 컴포넌트에서 민감하게 다루는 IUnknown 인터페이스의 의미와 일맥 상통한다, COM 객체의 참조 카운트(Reference Cout) 0 되지 않으면자원은 해제되지 않는다여기에서 COM 가장 고질적인 문제가 발생한다바로 DLL 지옥이다. Windows 8 스타일 앱의 메모리 위치는  메모리 영역이 아닌 공유되는 메모리 영역에 위치하고 있고, DLL Verserning 자유롭지 못하다. .NET 처럼 GAC(Global Assembly Cache)에서 DLL 버전별로 관리되지 않는다.

따라서, WinRT 런타임 라이브러리를 개발하여 배포된 Windows 8 앱이 활성화 상태일  새로운 앱에서 버전업 WinRT 런타임 라이브러리 배포시에 다른 프로세스가 점유하고 있다는 오류가 발생한다이는 앱이 초절전 유휴 상태에 진입되어도 마찬가지이다.

이찌되었든 개발 환경에서는 충분히 발생된 문제이니차후 Windows App Store에서도 발생할지는 지켜보아야 것이다.

   

Windows 8 Windows Runtime  재배포 정책  업데이트

 런타임 라이브러리인 만큼 라이브러리 코드가 완벽하지는 않을 것이다. .NET Framework 1.0부터 4.5까지 버전업이 되어왔는데 과연 Windows 8 Windows Runtime 어떻게 버전업이 될까사용자의 동의 없이 업데이트나패치는 불가능하다.

   

Windows 8 Features Pack 1,2,3… 시리즈로 업데이트가 될까?
Windows 8 Service Pack 1,2,3… 시리즈로 업데이트가 될까?

   

만약 이렇게 되면, Windows 8 스타일  간에 호환성 문제가 발생할 것이 분명하다. Apple iPhone 모바일 폰의운영체제 업데이트가 실시간으로온라인으로 이루어진다. Windows 8  iPhone 업데이트와 차원이 달라진다. WinRT 지원하는 ARM 버전과 기존의 Windows 8 Desktop 지원하는 x86 버전   가지의 에디션이 있다.

혹시  부분에 대해서 알고 있는 정보가 있으면 공유 부탁 드립니다.

[ VC11-C++11 ] range base for - 1

C++0x 2012. 8. 21. 19:20 Posted by 알 수 없는 사용자

VC10에서 선보였던 C++11의 기능 중 강력하면서 사용하기 쉽고, 자주 사용한 기능이 아마 'auto'이지 않을까 생각합니다. 예전에 강연을 할 때 auto와 관련된 예제를 보여드리면 많은 분들이 아주 좋아하시더군요(좀 놀라기도 하시더군요^^). 어떤 분들은 딴 건 제쳐두고 이것 때문이라도 VC10을 사용해야겠다는 분들이 있었습니다.

 

이번 VC11에서도 'auto'와 같은 강력한 기능이 있습니다. 바로 'range base for' 입니다. 이것을 사용하면 반복문을 아주 쉽고, 강력하게 사용할 수 있습니다.

VC 특화 기능인 for each와 비슷하기 때문에 기존에 for each를 사용하고 있다면 이제는 range base for로 쉽게 바꾸어서 사용하면 됩니다.

 

 

예제를 통해 일반적인 for , VC for each, range base for문의 차이를 예제를 통해서 보겠습니다.

 

< 예제. 1 >

#include <iostream>

int main()

{

           int NumberList[5] = { 1, 2, 3, 4, 5 };

 

          

           std::cout << "일반적인 for " << std::endl;

          

           for( int i = 0; i < 5; ++i )

           {

                     std::cout << i << std::endl;

           }

 

 

           std::cout << "VC++ 특화의 for each" << std::endl;

 

           for each( int i in NumberList )

           {

                     std::cout << i << std::endl;

           }

 

 

           std::cout << "range base for " << std::endl;

 

           for( auto i : NumberList )

           {

                     std::cout << i << std::endl;

           }

 

           return 0;

}

 

< 실행 결과 >


<예제.1>을 보면 일반적인 for 문은

for( int i = 0; i < 5; ++i )

와 같이 시작과 종료 조건, 증가 값 이렇게 3개의 조건에 의해서 반복 됩니다.

 

그러나 range base for문은 VC만의 반복문인 for each와 비슷하게 데이터셋 변수와 이 데이터셋 요소의 타입을 선언하면 됩니다.

for( auto i : NumberList )

 

기존의 for 문에 비해서 또는 for each 보다도 간편해졌고, for each는 표준이 아닌 VC만의 기능인 것에 비해서 range base for C++ 표준 기능입니다.

 

range base for 문의 문법은 아래와 같습니다.

for ( for-range-declaration : expression ) statement

  

range base for 덕분에 반복문의 사용이 쉬워졌고, for 문을 사용할 때 종료 조건이 잘못되어 메모리 침범을 하는 위험도 피할 수 있게 되었습니다.

[ VC11-C++11 ] chrono - clock 클래스

C++0x 2012. 8. 14. 09:00 Posted by 알 수 없는 사용자

이번은 chrono clock 클래스에 대해서 간단하게 설명 하겠습니다.

앞의 글들을 보신 분 들은 아시겠지만 이미 clock 클래스를 사용하고 있었습니다.

 

다만 저는 현재까지는 system_clock 이라는 클래스만을 사용하고 있었습니다.

 

chrono에는 system_clock뿐만 아닌 steady_clock high_resolution_clock이 있습니다.

 

 

namespace std {

 

namespace chrono {

 

  class system_clock;

 

}}

 

 

namespace std {

 

namespace chrono {

 

  class steady_clock;

 

}}

 

   

 

namespace std {

 

namespace chrono {

 

  class high_resolution_clock;

 

}}

 

 

system_clock는 가장 일반적으로 사용하는 것으로 시스템 시간을 표현하기 위한 시간입니다.

그리고 C 런타임의 time_t와 호환성을 가지고 있습니다.

 

멤버 중에 to_time_t from_time_t가 있는데 이름을 보면 알 수 있듯이

to_time_t system_clock::time_point time_t로 변환하고,

from_time_t time_t system_clock::time_point로 변환 합니다.

 

 

// to_time_t

system_clock::time_point CurTime = system_clock::now();

std::time_t t = system_clock::to_time_t(CurTime);

 

// from_time_t

std::time_t t = time(NULL);

system_clock::time_point CurTime = system_clock::from_time_t(t);

 

 

steady_clock은 물리적인 시간처럼 결코 역행하지 않는 시간을 나타내기 위한 시간입니다.

이 말은 steady_clock 이외의 clock 클래스는 time_point를 얻은 후 os에서 날짜를 과거를 되돌린 후 time_point을 얻으면 앞에 얻은 시간보다 과거의 시간이 얻어지는데 steady_clock에서는 절대 그렇지 않습니다. 그래서 시간의 흐름이 바뀌지 않는 시간을 얻고 싶을 때는 steady_clock을 사용합니다.

 

 

high_resolution_clock는 해당 플랫폼(Windows 또는 Linux )에서 가장 짧은 단위의 시간입니다.

이 클래스는 system_clock steady_clock의 다른 별칭으로 정의되기도 합니다.

 

 

 

보통 프로그래밍에서 아주 고해상도의 시간 단위가 아닌 경우 대부분 GetTickCount() 함수를 사용했는데(Windows에서) 앞으로는 더 간단하고 다양한 표현 방법으로 시간을 다룰 수 있는 chrono를 꼭 사용해 보시기 바랍니다^^

 

[ VC11-C++11 ] chrono - 시간 계산

C++0x 2012. 8. 7. 09:00 Posted by 알 수 없는 사용자

<예제.2>에서 보았듯이 chrono는 다양한 정밀도 타입으로 시간을 표시할 수 있습니다.

 

그리고 각 시간 정밀도 타입 별로 생성할 때 미리 값을 설정할 수 있습니다.

 

std::chrono::hours H1(1);

std::chrono::seconds S1(10);

std::chrono::milliseconds MILS1(100);

 


또한 이 시간 타입을 서로 연산할 수도 있습니다.

 

std::chrono::hours H1(1);

std::chrono::hours H2(2);

std::chrono::hours H3 = H1 + H2;

 


물론 다른 시간 타입을 연산할 수도 있습니다

 

std::chrono::seconds S1(10);

std::chrono::milliseconds MILS1(100);

std::chrono::milliseconds MILS2 = S1 + MILS1;

 

다른 시간 타입을 연산할 때 주의할 점이 있습니다. 아래처럼

 

std::chrono::milliseconds MILS2 = S1 + MILS1;

 

의 경우는 초와 밀리초라는 서로 다른 타입을 더하지만 값을 저장하는 타입이 밀리초이기 때문에 잃어버리는 값이 발생하지 않으므로 연산에 문제가 없습니다.

 

그러나 아래와 같이

std::chrono:: seconds S2 = S1 + MILS1;

로 하는 경우는 밀리초 부분을 잃어버리게 되기 때문에 컴파일 에러가 발생합니다.

 

이런 경우는 명시적으로 형 변환을 시켜줘야 합니다.

 

std::chrono::seconds S2 = std::chrono::duration_cast< std::chrono::seconds >(S1 + MILS1);

 

 

< 예제. 3 >

#include <chrono>

#include <iostream>

 

int main()

{

    {

        std::chrono::hours H1(1); // 1시간

       

        std::cout << "H1(1) : " << H1.count() << std::endl;

        

        std::chrono::seconds S1(10);

        std::chrono::seconds S2(120);

 

        std::cout << "S1(10) : " << S1.count() << std::endl;

        std::cout << "S2(120) : " << S2.count() << std::endl;

    }

 

    {

        std::chrono::hours H1(1);

        std::chrono::hours H2(2);

        std::chrono::hours H3 = H1 + H2;

 

        std::cout << "H1 + H2 = : " << H3.count() << std::endl;

  

        std::chrono::seconds S1(10);

        std::chrono::milliseconds MILS1(100);

        std::chrono::milliseconds MILS2 = S1 + MILS1;

 

        std::cout << "S1 + MILS1 = : " << MILS2.count() << std::endl;

  

        std::chrono::seconds S2 = std::chrono::duration_cast< std::chrono::seconds >(S1 + MILS1);

 

        std::cout << "S1 + MILS1 = : " << S2.count() << std::endl;

    }

 

    return 0;

}

 

< 실행 결과 >


본 글을 월간 마이크로소프트 2012년 5월호 특집 기사로 다루어진 내용입니다. Visual Studio 11이 Visual Studio 2012로 변경됨에 따라 본문의 내용을 일부 수정하였습니다.

 

본 글 이외에 Visual Studio 팀원의 강보람 MVP님의 "Welcome to Metro User Interface" 컬럼과 남정현 MVP님의 "Windows Server 8 미리 보기" 컬럼은 필자의 블로그에 기재하지 않은 점 또한 참고하기 바라며, 저작자의 동의하에 추후에 공개가 될 수 있습니다.

 

 

시대가 바뀌면서 Windows도 전통적인 모습에서 벗어나서 새로운 흐름을 만들고자 하는 노력이 시작된 것 같다. 물론 기존의 데스크 탑은 여전히 널리 사용될 것이다. 일상적인 업무에서 사용하는 응용 프로그램이 굳이 메트로 사용자 인터페이스 형태를 띌 필요는 전혀 없을 테니 말이다. 그리고 앞으로도 계속해서 기존의 데스크 탑을 타겟으로 하는 윈폼이나, WPF의 개발도 지속될 것이다. 하지만, 새로운 기회는 작은 틈에서 나오는 것이니 이 틈새를 잘 이해하기 위해서는 Windows 8의 메트로 환경을 잘 이해할 필요가 있다.

 

Windows 8과 Visual Studio 2012은 그야말로 N스크린에 감히 필수적인 환경이라고 말하고 싶다. 그 어떤 플랫폼도 데스크 탑과 테블릿, 모바일 등의 모든 기기와 환경 모두를 지원하는 것은 매우 어려운 일이다. 일반 사용자가 기기마다 사용하는 용도와 스타일이 다르고, 모바일 기기마다 해상도와 특징이 다르기 때문이기도 하지만, 하나의 개발 도구로 모든 상황을 대응할 수 있는 통합 개발 도구가 없는 것도 한 몫을 한다. 아니라고 말하는 독자도 있겠지만, 필자는 데스크 탑 환경까지 확장하는 N스크린을 말하는 것이고, 모든 N개의 스크린에서 똑같은 사용자 경험을 제공하는 것을 말한다. 이런 관점에서 Windows 8과 Visual Studio 2012은 그 해답을 제시하고 있으며, 충분히 가치 있고, 도전해 볼만하다. 이런 이유로 벌써부터 필자는 매우 흥분이 된다.

 

그리고 이 글에서 모두 소개하기는 어려웠지만, Windows Server 8은 그 동안의 Windows 운영 체제가 보여주었던 정적인 모습을 탈피하여 대규모 데이터 센터가 아닌 비용 문제 때문에 고민이 많은 수 많은 중소 규모의 IT 인프라에서도 효율적으로 시스템을 운영하고 애플리케이션 개발자들이 핵심에만 접근할 수 있도록 도와줄 방법을 제공하고 있다. 또한 메트로 스타일의 앱은 단순히 사용자 인터페이스에 관한 새로운 접근일 뿐만 아니라 데스크톱 가상화나 서버 관리자를 위한 새로운 종류의 서비스로 자리잡을 수 있다. 여전히 Charm Bar의 기능은 유용하게 사용할 수 있으며, Application Contract를 정확하게 지원하는 서버용 메트로 앱을 만들어 서버 관리자의 일을 덜어내거나 전혀 새로운 경험의 터치 기반 KIOSK를 손쉽게 만들 수도 있을 것이다. 이것은 전적으로 여러분의 선택에 달려있는 일이 될 것이다. 더 나아가서, Windows Server 8의 여러 기술들이 각종 호스팅 환경은 물론 Windows Azure나 Amazon과 같은 Public Cloud Computing 환경에도 전면적으로 도입이 된다면 더 멋지고 유용한 서비스들이 대거 등장하지 않겠는가 하는 것이 개인적인 생각이다.

 

참고 자료

본 글을 월간 마이크로소프트 2012년 5월호 특집 기사로 다루어진 내용입니다. Visual Studio 11이 Visual Studio 2012로 변경됨에 따라 본문의 내용을 일부 수정하였습니다. 그리고 현재 필자는 NCSOFT에 재직하지 않음을 참고하기 바랍니다.



엄준일 – 현재 NCSOFT에 재직 중이며, Microsoft ALM MVP와 한국 Visual Studio 팀과 블로그를 운영하고 있다.. 주로 .NET 기술을 전파하고 있고, 마이크로소프트가 지향하는 소프트웨어 개발 프로세스와 통합 및 테스팅 분야를 4년 동안 공부해왔다. 그 외에 CodePlex 오픈 소스 사이트를 통해 프레임워크, 툴 그리고 라이브러리 등을 공개하여 운영 중이다.



 

 


C++ 매트로 앱 개발 준비 사항

C++ 매트로 앱을 개발하기 위해 C++ 개발자는 당장 개발하기 앞서 몇 가지 숙지해야 할 지식과 개념들이 있다. 그리 어려운 것들은 아니지만, 이것을 모르고 접근하려고 하면 어디서부터 시작해야 할지 매우 혼란스러울 것이다. 필자는 과거에 C와 PASCAL을 주로 사용하였고, PC통신이라는 커뮤니케이션을 통해 여러 가지 액션 게임과 대전 게임, 어드벤처 게임을 개발하여 공개해 본 적은 있으나, 최근에 사용되는 C++과 DirectX로 개발해 본 경험은 전무하다. 대신 C라는 언어와 윈도우8이라는 공통 분모를 바탕으로 최대한 C++ 개발자에게 매트로 앱을 쉽게 개발하기 위해 설명할 것이다.

 

C++/CX 란?

첫 번째 준비사항은, C++ 매트로 앱 개발의 위해 C++/CX를 이해해야 한다. C++/CX는 C++ Components Extension(C++ 컴포넌트 확장)이라는 의미로 그 문법은 C++/CLI와 매우 흡사하다. C++/CLI의 대부분은 .NET의 MSIL 형태의 목적 파일로 컴파일 되기 때문에, C++/CLI 응용 프로그램이 동작하기 위해서는 .NET Framework가 설치가 되어야 했었다. 이는 곧, C++/CLI의 gcnew 객체는 .NET 가비지컬렉션의 대상이 되기 때문에 .NET에 매우 가까운 구조였다. 반면, C++/CX은 간단하게 정의하자면 간결한 COM 프로그래밍 언어이다. 그 문법이 C++/CLI와 같지만, 완벽하게 네이티브 형태로 컴파일 된다. 이 말은 즉, .NET Framework이 필요가 없고, .NET 가비지컬렉션의 대상이 되지도 않는다.


앱 개발에 필수 런타임인 WinRT(Windows Runtime)를 이용하여 구현을 하기 위해선 IInspectable 인터페이스를 구현해야 한다. COM 프로그래밍에 직간접적으로 IUnknown 인터페이스를 구현하는 것과 같다. 왜냐하면 IInspectable 인터페이스는 IUnknwon 인터페이스를 상속하기 때문이다.

IInspectable 인터페이스는 곧 COM 개념과 같다. 컴포넌트를 다양한 언어와 공유하고 통합할 수 있는데 WinRT 프로그래밍에서 C#, VB.NET, 그리고 JavaScript에서 IInspectable을 구현하는 객체를 사용할 수 있게 된다. (단, IInspectable 인터페이스는 컴파일러에 의해 구현될 수 있다)

MIDL_INTERFACE("AF86E2E0-B12D-4c6a-9C5A-D7AA65101E90")

IInspectable : public IUnknown    

{

public:

virtual HRESULT STDMETHODCALLTYPE GetIids(

/* [out] */ __RPC__out ULONG *iidCount,

/* [size_is][size_is][out] */ __RPC__deref_out_ecount_full_opt(*iidCount) IID **iids) = 0;

 

virtual HRESULT STDMETHODCALLTYPE GetRuntimeClassName(

/* [out] */ __RPC__deref_out_opt HSTRING *className) = 0;

 

virtual HRESULT STDMETHODCALLTYPE GetTrustLevel(

/* [out] */ __RPC__out TrustLevel *trustLevel) = 0;

 

};

Code 1 IInspectable 인터페이스 정의

COM 프로그래밍 중 가장 빈번하게 사용되는 것 중 하나가 참조 카운팅인데, ^ 기호로 참조 카운팅을 관리하는 개체를 ref new로 인스턴스를 생성하면 더 이상 귀찮은 AddRef와 Release메서드를 호출해 줄 필요가 없다. 예를 들어, Platform::WeakReference 등을 이용하여 생성된 객체에 대해 수명 관리를 위임할 수 있는 방법들이 제공된다.


정리해보면, WRL(Windows Runtime Library)가 C#, VB.NET, JavaScript로 개발할 수 있는 환경을 제공하는 것이 바로 COM이며, 이를 쉽게 개발할 수 있는 언어가 C++/CX인 것이다.

 


프로퍼티(Property) 사용

C++/CX는 프로퍼티를 사용할 수 있는 키워드를 제공한다. C++/CX 프로퍼티는 .NET 프로퍼티와 내부적으로 똑같이 동작한다. 이 프로퍼티는 컴파일 시에 get/set 메서드를 자동으로 생성해 준다. 프로퍼티는 읽기 전용/쓰기 전용, 그리고 이 두 가지 모두를 지원하도록 구현할 수 있다.


이 프로퍼티는 매트로 앱을 개발하면서 상당히 자주 만나게 될 것이다. 왜냐하면 XAML과 함께 앱을 구현하면서 바인딩(Binding) 개념에 프로퍼티 구현이 필수적이기 때문이다. 그래서 XAML 바인딩에서 INotifyPropertyChanged 인터페이스를 구현하여 데이터 모델과 바인딩된 데이터간에 데이터 변경에 대해 알려줌으로써 1-way 또는 2-ways 바인딩을 사용한다.

#include "pch.h"

 

public ref class Person sealed

{

private:

    Platform::String^ name;

    int age;

 

public:

    Person(Platform::Stringname)

    {

        this->name = name;

    }

 

    // 읽기 전용 프로퍼티

    property Platform::String^ Name

    {

        Platform::String^ get() { return this->name; }

    }

 

    // 읽기 쓰기 프로퍼티

    property int Age

    {

        int get() { return this->age; }

        void set(int age)

        {

            ifage <=0 ) throw ref new Platform::InvalidArgumentException();

 

            this->age = age;

        }

    }

};

Code 2 C++/CX 프로퍼티

이 프로퍼티는 내부적으로 생성되는 get/set 매서드를 사용하는 것이 아니라 선언된 프로퍼티를 마치 맴버 변수처럼 사용이 가능하다. 일반적인 C++ 에서는 get/set 메서드를 구현하는 방식으로 person->setName(L"Junil Um"); 이런 코드를  이상 사용하지 않는다.

아래의 코드와 같이 프로퍼티로 선언한 이름으로 직접 엑세스할 수 있다.

Person^ person = ref new Person("Junil Um");

person->Age = 20;

 

필자는 매크로를 사용하여 좀 더 빠르고 쉽게 프로퍼티를 선언하여 사용하는 방식을 권하고 싶다. 아래의 코드는 프로퍼티의 get 또는 set, get/set 을 매크로로 대체한 것이다.

#define __PROPERTY_GET_FUNC(TYPE, NAME) TYPE get() { return m_##NAME; }

#define __PROPERTY_SET_FUNC(TYPE, NAME) void set(TYPE value) { m_##NAME = value; }

#define DEFINE_PROPERTY(TYPE, TYPENAME) property TYPE TYPENAME

#define __PROPERTY(TYPE, NAME, IMPL) \

private: \

    TYPE m_##NAME; \

public: \

    DEFINE_PROPERTY(TYPE, NAME) \

    { \

    IMPL \

    } \

 

#define PROPERTY_GET(TYPE, NAME) __PROPERTY(TYPE, NAME, __PROPERTY_GET_FUNC(TYPE, NAME))

#define PROPERTY_SET(TYPE, NAME) __PROPERTY(TYPE, NAME, __PROPERTY_SET_FUNC(TYPE, NAME))

#define PROPERTY(TYPE, NAME) __PROPERTY(TYPE, NAME, __PROPERTY_GET_FUNC(TYPE, NAME) __PROPERTY_SET_FUNC(TYPE, NAME))

 

 

안전한 포인터 사용, 대리자(Delegate)

포인터 함수는 C++에서 흔히 사용되지만, WinRT 프로그래밍에서는 직접적인 포인터 연산이 그리 좋은 코드는 아닐 수 있다. 이유는 간단하다. WinRT APIs (내장 라이브러리)들이 인자 값으로 포인터가 아닌 대리자(Delegate)를 즐겨 전달 받는다. 그리고 이벤트(Events) 프로그래밍에서 대리자를 공통적으로 사용한다.

void ShowMessageBox(Platform::String^ str)

{

    auto dialog = ref new Windows::UI::Popups::MessageDialog(str);

    dialog->ShowAsync();

}

 

 

void App::OnLaunched(LaunchActivatedEventArgs^ pArgs)

{

    auto ptr = &ShowMessageBox;

 

    ptr("Hello Metro App with C++");

}

Code 3 함수 포인터

.NET 에서는 대리자(Delegate)를 안전한 포인터 함수라고 정의한다. 포인터 함수를 사용하든, 대리자를 사용하든 결과는 똑같지만 이왕이면 안전하게 제어할 수 있는 대리자를 사용하라는 것이다. 사실, .NET 에서 대리자는 일반적인 클래스(Class)와 똑같이 취급한다. 대리자는 컴파일이 되면 일반적인 클래스로 정의되기 때문이다.

어쨌든 위의 포인터 함수를 대리자로 바꾸어보면 다음과 같다.

delegate void ShowMessageBoxHandler(Platform::String^ str);

void ShowMessageBox(Platform::Stringstr)

{

    auto dialog = ref new Windows::UI::Popups::MessageDialog(str);

    dialog->ShowAsync();

}

 

void BlankPage::OnNavigatedTo(NavigationEventArgse)

{

    auto msghandler = ref new ShowMessageBoxHandler(&ShowMessageBox);

    msghandler("Hello Metro App with C++");

}

Code 4 C++/CX 대리자

C++/CX 매트로 만들기 첫 걸음

이제 매트로 앱 코드를 작성하고 이해하기 위한 어느 정도의 준비는 된 것 같다. 매트로 앱은 처음 앱의 처음 진입점이 App클래스의 OnLaunched 메서드이다.

void App::OnLaunched(LaunchActivatedEventArgspArgs)

{

    auto sampleData = ref new SampleDataSource();

 

    auto rootFrame = ref new Frame();

    TypeName pageType = { GroupedItemsPage::typeid->FullName, TypeKind::Metadata };

    rootFrame->Navigate(pageType, sampleData->ItemGroups);

 

    Window::Current->Content = rootFrame;

    Window::Current->Activate();

}

Code 5 앱 진입점인 App 클래스

 

위의 코드의 LaunchActivatedEventArgs 인자는 main 함수의 인자 값이라고 생각해도 좋다. 단지 다른 점을 찾는다면 LaunchActivatedEventArgs 객체는 COM Proxy 개체로써, 앱 실행시 인자 값 등을 전달 받을 수 있다. .

이곳에서 앱의 초기화를 수행한 후에 Frame->Navigate 메서드로 사용자 인터페이스를 가지고 있는 화면으로 이동한다. C#,VB.NET 그리고 C++ 매트로 앱은 XAML(Extensible Application Markup Language)을 이용한다. 처음 .NET Framework 3.0에서 WPF 응용 프로그램에서 XAML을 주로 사용하였으나, .NET Framework 4.0에 와서는 별도의 구성요소로 분리가 되었고, 현 버전에서는 완전히 독립된 컴포넌트로 구성되었다. XML은 언어의 분류상 객체지향언어로 구분하게 되는데 XAML은 객체지향언어와 상호작용이 가능하여 그 확장의 가능성이 무한대로 볼 수 있다.


매트로 앱과 친해지기 위해서는 C++/CX도 이해해야겠지만, XAML도 항상 벗처럼 삼아야 한다. XML 프로그래밍에 익숙한 독자라면 XAML이 어렵지 않을 것이다. XML 프로그래밍은 책 몇 권의 분량으로도 모두 담지 못할 것이다. 그리고 XAML 또한 책 한 권 분량 이상으로 그 내용이 방대하므로 더 자세한 내용은 MSDN을 통해 천천히 익히길 바란다.

Figure 1 Blend for Visual Studio 2012

 

XAML을 처음부터 거부감을 느낄 필요는 없다. 당장은 앱을 만들기 위해 디자인을 해야 하는데, Blend for Visual Studio 2012 (과거 Expression Blend) 라는 디자인 도구가 있다. XAML은 이 도구를 이용하여 디자인을 하면 개발자도 쉽게 사용자 인터페이스를 완성할 수 있다.

지면으로 모든 것을 설명하지 못하니, 다음의 링크를 반드시 확인하기 바란다.

http://msdn.microsoft.com/en-us/windows/apps/br229516

이 링크에서 매트로 앱을 만들기 위한 개발 도구 및 SDK와 샘플 앱을 C#, C++, JavaScript로 구현해 놓았고, 마이크로소프트가 제공하는 품질 좋은 디자인 파일도 있다.

본 글을 월간 마이크로소프트 2012년 5월호 특집 기사로 다루어진 내용입니다. Visual Studio 11이 Visual Studio 2012로 변경됨에 따라 본문의 내용을 일부 수정하였습니다. 그리고 현재 필자는 NCSOFT에 재직하지 않음을 참고하기 바랍니다.


 

엄준일 – 현재 NCSOFT에 재직 중이며, Microsoft ALM MVP와 한국 Visual Studio 팀과 블로그를 운영하고 있다.. 주로 .NET 기술을 전파하고 있고, 마이크로소프트가 지향하는 소프트웨어 개발 프로세스와 통합 및 테스팅 분야를 4년 동안 공부해왔다. 그 외에 CodePlex 오픈 소스 사이트를 통해 프레임워크, 툴 그리고 라이브러리 등을 공개하여 운영 중이다.




 

성큼 다가온 Visual Studio 2012

Microsoft의 대표적인 통합 개발 도구인 Visual Studio 2012의 성장세가 무척 빠르다. 지난 10년전 .NET 플랫폼과 함께 대표적인 개발 도구인 Visual Studio.NET (2003버전)를 내놓았다. 그 때의 시간이 바로 엊그제 같은데 그 이후 Visual Studio 2005, 2008, 2010을 지나 Visual Studio 2012베타 버전을 필자가 사용하고 있으니, 짧은 10년동안 Microsoft를 비롯하여 개발 언어, 개발 툴, 이 모든 것이 굉장히 많이 변해 왔음을 새삼 다시 느껴진다. 이제 Windows 8라는 새로운 운영체제가 기다리고 있다. 그리고 이를 빛내줄 Visual Studio 2012.

 

성큼 다가온 Visual Studio 2012과 그 발자취

Visual Studio 2012를 먼저 논하기 전에 Visual Studio가 어떤 발자취를 남기며 발전해 왔는지 간단하게 살펴보는 것도 독자들이 Visual Studio 2012를 이해할 수 있는 좋은 방법이라고 생각한다. 물론 짧고 간단하게 모든 것을 설명할 수는 없지만, 전반적인 특징만으로 그 동안 개발 트랜드가 어떻게 바뀌었고, 시장의 요구 사항이 어떻게 변화하여 왔는지 한 눈에 알 수 있는 가장 좋은 방법이라고 생각한다.

 

Microsoft의 첫 번째 진정한 통합 제품으로 평가 받는 제품이 Visual Studio.NET (2003버전)이다. Microsoft의 전략적인 언어인 C# 1.0과 VB.NET(v7.0)이 .NET 개발의 대표적인 언어가 되었다. 기존의 VB를 세련된 객체지향 언어로 탈바꿈하면서 이전의 VB개발자들에게 .NET 개발의 문턱을 낮출 수 있는 매우 좋은 사례이기도 하다. (단, Visual Studio 2002는 논외로 하겠다)

이 이전의 개발도구는 하나의 도구에서는 하나의 언어로만 개발을 할 수 있었고, 개발 툴 역시 그 언어에 매우 종속적이고, 다른 언어로 전환하려면 이전의 개발 도구와 개발 경험 역시 많은 부분을 새로 습득해야 했다. 특히 J# 이라고 하는 Java 언어와 라이브러리를 제공하였는데, Java 개발자들을 .NET 플랫폼 안으로 끌어안기 위한 매우 독특한 사례이기도 하다. 실제로 J#은 웬만한 Java 소스 코드를 변경 없이 .NET 목적 파일로 컴파일 할 수 있었다.

Visual Studio는 하나의 개발 도구를 통해 여러 가지 언어를 선택하여 웹 응용 프로그램, 윈도우 응용 프로그램, 모바일 개발, XML, XML 웹 서비스를 개발을 통합하고, 여기에 포함되는 .NET Framework 1.0은 응용 프로그램을 빌드하고 실행하는 구성요소로서, ADO.NET, ASP.NET, Windows Forms 등을 포함하는 .NET Framework 클래스 라이브러리와 CLR(Common Language Runtime-공용 언어 런타임)을 제공, 이 CLR 을 통해 공통된 API 집합을 만들어 다양한 언어간의 상속, 오류 처리, 디버깅이 가능하며 개발자들은 사용하려는 언어를 자유롭게 선택할 수 있게 되었다.

이 후, Windows Server 2003 제품에 표준으로 탑재하여 .NET Framework의 확산에 큰 공을 이루게 되었고, 실제로 엔터프라이즈 시장에서 이 버전을 기준으로 많은 기업용 시스템에 도입이 되었다. 현재까지도 이 버전을 기준으로 운영이 되는 기업용 시스템이 상당수 존재하고 있을 정도이다.


 

때는 2005년. Visual Studio 2005버전은 파격 그 자체다. 여기에 포함된 런타임인 ..NET Framework 2.0은 이전 .NET Framework 1.x에 사용된 코드를 대부분 갈아 엎었을 정도이다. .NET Framework의 뼛속까지 변신한 것이다. ASP.NET 2.0, ADO.NET 2.0, Windows Forms 2.0, C# 2.0 과 같이 '~2.0' 이라는 버전 번호를 붙였고, 많은 기능이 보완되고 확장되었다. .NET Framework 2.0 의 주요 컴포넌트들은 더 이상 .NET Framework 1.1 에 의존하지 않게 되었으며, .NET Framework 2.0 은 .NET Framework 3.5 SP1 까지 .NET Framework의 모태가 된다.

모든 것이 생소할 정도로 많은 변신이 있었는데, 그 중에서 C#과 VB.NET 언어가 대표적이다. Boxing(박싱), Unboxing(언박싱)의 반복적인 캐스팅(Casting) 의 비효율을 개선하고, 보다 객체지향적인 코드 품질을 생산할 수 있는 제네릭(Generic)이 등장하였다. 이와 함께 .NET Framework 클래스 라이브러리에 다수의 제네릭(Generic) 클래스가 추가되었다. 개발 툴도 많은 변화가 있었는데, IDE 자체의 외관도 많이 변했고, 개발 툴의 내부적인 코드에서 변화가 왔고 다양한 내부 인터페이스가 추가되었다. Visual Studio의 솔루션 탐색기에서 흔히 사용하는 '솔루션 폴더'도 이때 등장하였다.

그리고, 이 제품의 버전부터 Visual Studio Team Suite + Team Foundation Server 의 제품을 조합하여 Visual Studio Team System(VSTS) 라는 새로운 개발 패러다임을 .NET 에서도 지원하게 되었다. VSTS 를 통해 ALM(Application Lifecycle Management-애플케이션 수명 주기 관리) 을 수행할 수 있게 되었으며, IT 조직의 비지니스 전반의 생산성을 향상 시키고, 사람과 개발 조직의 변화를 가져다 주는 시초가 되었다.


 

.NET Framework 3.0은 새로운 개발 도구와 출시되지 않았다. 2005년 중순 Windows Vista 운영체제가 출시되면서 이에 대응하는 라이브러리가 포함이 되었다. 함께 새로운 기술도 대거 포함이 되었는데, 그 중에서 대표적으로 꼽으라고 하면 WPF와 WCF이다. XAML(Extensible Application Markup Language) 과 함께 WPF 의 출연으로 UX(User Experience) 의 시대 흐름에 진입하게 되었다. 또한, WCF는 여러 가지의 분산 통신 기술이 통합되었다. 이전의 Remoting, XML Web Services, MSMQ 등이 하나의 WCF 컴포넌트에서 제공하게 됨으로써 Messaging Model 기반으로 통합할 수 있게 되었다.


 

 

 

때는 2007년, 또 한번의 메이저 급 업데이트였다 언어적으로 LINQ라는 새로운 녀석 때문이다. LINQ(Language Integrated Query) 라는 이름에서 알 수 있듯이 익숙한 SQL Query 문법과 유사하여 객체 탐색에 있어 효율성이 매우 높아졌고, 그 성능도 일일이 손으로 짠 코드보다 더 빠른 경우가 있다. 이 LINQ의 기반이 되는 람다식(Lambda Expression), 익명 타입(Anonymous Type), 확장 메서드(Extension Methods)의 언어적인 새로운 스팩이 한데 아우러져 LINQ를 구성한다. XML객체, DataSet, 파일 시스템, 컬렉션 등 모든 대상이 LINQ 쿼리식의 대상이 된다. 이에 영향을 받아 JavaScript와 Java 언어에 영향을 주어 LINQ와 유사한 프레임워크가 등장하였지만, .NET 과 같이 언어적으로 통합이 되지 않았다. 마치 Method Chaining 패턴을 이용한 라이브러리로 분류된다.

이 밖에 정말 헤아릴 수 없을 정도의 많은 진보가 있었다. 개발 도구와 개발 언어, 그리고 .NET 플랫폼의 기술이 발전한다는 것은 분명 매우 좋은 일이겠지만 아마 이 시기부터 많은 .NET 개발자들이 Microsoft의 기술 발전을 따라가기 벅차했었다.

 

2010년에 이르러, Visual Studio 2010버전이 출시되었다. 너무 빠른 .NET 기술의 발전의 탓일까, 이 때는 언어와 .NET Framework보다는 Visual Studio라는 개발 툴에 가장 초점이 맞추어졌다. 그 중 핵심 키워드라고 할 수 있는 것 3가지는 "시각화", "디버깅", "프로세스" 일 것이다. (필자의 의견이므로 Microsoft가 추구했던 것과는 다를 수 있다.) 이 세 가지의 핵심 키워드는 시각화, 협업에 있어 코드의 이해를 좀 더 쉽게, 그리고 복잡한 데이터를 한 눈에 알 기 쉽게… 디버깅-디버깅 시 데이터의 수집이 혁신적으로 발전하였고, 물리적으로 분리된 티어(Tier)간에 데이터 수집… 프로세스, 애자일을 강조하고 애자일한 통합 프로세스를 개발 툴에 제공.

.NET Framework 4.0은 .NET Framework 2.0기반이 아닌 새로운 프레임워크로 구성되었고, 멀티코어 처리를 위해 강력한 병렬 처리 라이브러리(Parallel Libraries)가 있다. 또, 동적 언어 런타임(Dynamic Language Runtime)으로 정적 형식과 동적 형식의 경계를 허물었으며, 루비(Ruby), Lisp, JavaScript, 파이썬(Phython), PHP와 같은 동적 언어와 상호 운용이 가능하다. 예를 들자면, C# 언어로 파이썬 개체와 상호 연동이 가능하다는 것이다.

 

  

제품의 버전 / 특징

2002년

  • Visual Studio .NET 2002 / .NET Framework 1.0 
    첫 통합 개발 환경 
    발매 당초의 제품명은 ' Visual Studio .NET 
  • C# 1.0 / Visual Basic .NET (7.0) 
    C# 은 마이크로소프트의 새로운 객체 지향 언어 
    Visual Basic 도 객체지향 언어

2003년

  • Visual Studio .NET 2003 / .NET Framework 1.1 (5월) 
  • C# 1.1 / Visual Basic .NET (7.1) 
    모두 버전 업 
  • Windows Server 2003 
    .NET Framework 1.1 표준 탑재

2005년

  • Visual Studio 2005 / .NET Framework 2.0 (12월) 
    ClickOnce 배포 
    제네릭 클래스 도입 
    ASP.NET 2.0, ADO.NET 2.0, Windows Form 2.0 
    리팩토링 기능 / 코드 스니펫 
    무료 Express Edition (C#, VB, C++) 
  • C# 2.0 / Visual Basic 2005 (8.0) 
    제네릭 대응 
  • Visual Studio 2005 Team System 
  • SQL Server 2005 지원

2006년

  • .NET Framework 3.0 (11월) 
    코어 부분은 .NET Framework 2.0 그대로 
    WPF(Windows Presentation Foundation) 
    WCF(Windows Communication Foundation) 
    WF(Windows Workflow Foundation) 
    CardSpace 
  • Windows Vista 
    .NET Framework 3.0 기본 탑재

2007년

  • Visual Studio 2005 Service Pack 1 (6월) 
  • ASP.NET AJAX 1.0 (추가 모듈) 
    AJAX Web Application 개발이 용이 
  • Expression Blend 
    Expression Studio 첫 제품 
    WPF 어플케이션의 GUI 구축
  • Visual Studio 2008 / .NET Framework 3.5 (11월 경) 
    개발 코드명 'Orcas' 
    WPF 의 GUI 설계 가능 
    Javascript 디버그 기능 및 IntelliSense 
    ASP.NET AJAX 표준 탑재 
    .NET Framework 2.0, 3.0, 3.5 선택 가능 
  • C# 3.0 / Visual Basic 2008 (9.0) 
    LINQ 기능 
  • SQL Server 2008 
  • Windows Server 2008 
  • Visual Studio Team System 2008

2008년

  • Visual Studio 2008 SP1 / .NET Framework SP1 
    ASP.NET Dynamic Data 
    ADO.NET Entity Framework / Data Services (Astoria) 
    WCF Atom Pub Services 
    클라이언트 프로파일(Client Profile) 
  • VSTS 
    Windows Server 2008 지원 
    SQL Server 2008 지원 
    성능 향상 및 개선 
  • Visual Studio SDK 1.1 (SP1) 
    Visual Studio Shell 재배포 패키지 경량화 
    DSL 출력 미리보기 등… 
  • Visual C++ 2008 
    오피스 리본 스타일 Interface 
    고급 GUI 컨트롤 등…

2010년

  • 사용자 친화적인 Visual Studio IDE
  • 코드 탐색 강화
  • 개발 툴에서 다양한 .NET Framework 개발 환경 제공
  • JavaScript 언어 개발 환경 강화
  • 다양한 플랫폼 지원
    • 64 Bit Mixed-Mode 디버깅
    • Managed 와 Mixed-Mode 의 Minidump 디버깅
  • Historical Debugger
    • 디버그 내용을 기록, 재생
  • 프로젝트 관리 및 프로세스 통합

 

 

Visual Studio 2012과 함께 매트로 앱 개발

Visual Studio 2012의 가장 큰 핵심은 바로 Windows 8 운영체제이다. Windows 8은 매트로 응용프로그램이라는 새로운 환경과 WinRT(Windows Runtime)인 새로운 런타임을 제공한다 그리고 Visual Studio 2012는 Windows 8 운영체제에 가장 최적화된 개발 툴이다. 독자들은 또 새로운 것을 배워야 하나라고 한숨을 쉴 수도 있을 것이다. 하지만 섣부른 독자들의 판단은 잠시 후에 하기 바란다. 왜냐하면 Windows 8 개발은 새로운 환경이면서도 새로운 환경이 아닐 수도 있다. Windows 8 운영체제를 사용하고 WinRT APIs 집합을 사용하는 것 이외에는 아무것도 변한 것이 없기 때문이다. 단지 바뀐 것은 여기에서 개발된 응용 프로그램은 데스크탑 컴퓨터, 테블릿, 모바일 환경 모두 실행되고 배포할 수 있다는 것이다.


최근 개발 환경을 엿보자면 C++을 사용하는 네이티브 개발과, NET에서 지원하는 C#과 같은 관리 언어, 그리고 웹 개발에 필요한 HTML과 JavaScript, 이 중에 단 한가지 기술 영역만 있으면 Windows 8 매트로 응용 프로그램 개발 준비는 끝이라는 것이다. 우리가 흔히 사용하는 스마트 폰을 보면 알 수 있듯이, 개발자는 단지 '위치 정보', '화면의 표현 방법', '데이터 연동', 그리고 스마트 폰을 가로로 볼 때와 세로로 볼 때와 같은 일상적인 기능을 제공하는 APIs를 익히기만 하면 된다. 기존에 Visual Studio를 사용하여 개발해 본 독자라면 그 만큼 진입 장벽이 낮다.


윈도우 폰7 개발처럼 테블릿 시뮬레이터가 제공이 된다. Windows 8 테블릿이 지원하는 대부분의 모든 기능을 이 시뮬레이터에서 테스트를 해 볼 수 있다. 윈도우 폰7 개발처럼 반드시 시뮬레이터가 필요한 것은 아니다. 실제 시뮬레이션이 필요 없다면 곧바로 로컬 데스크 탑에서 매트로 앱을 실행해 볼 수 있다.

Figure 1 Visual Studio 2012 매트로 앱 실행 및 디버깅

 

Figure 2 시뮬레이터 실행 환경

 

더불어 Visual Studio에서 제공하던 성능 측정 도구와 코드 정적 검사를 매트로 앱 개발 환경에서도 그대로 이용할 수 있다. 이는 곧 Visual Studio 2012이 Windows 8 개발에 가장 최적화가 되었다는 의미가 된다.

 

Figure 3 매트로 앱 성능 측정 및 진단

 

간략하게 나마 Visual Studio 2012과 Windows 8 개발에 대해 살펴보았다. 필자가 얘기한 것처럼 개발자에게 있어 새로운 환경이지만, 반대로 전혀 새롭지 않기도 하다. Visual Studio로 간단한 앱을 만들 수 있는 실력이라면 곧바로 Windows 8 매트로 앱을 개발할 수 있을 정도로 진입 장벽이 낮다. 물론, 좀 더 기술적이거나 독창적이고 예쁜 앱을 만드는 것은 더 많은 노력이 필요하다. 단지, 앱 개발자는 자신만의 앱 개발에만 집중하면 된다.

 

Figure 4 Windows 8 개발에서 배포까지

 

Visual Studio 2012과 함께 매트로 환경의 게임 개발

데스크 탑과 테블릿, 그리고 모바일 앱 중에서 단연 게임이 빠질 수 없다. 매트로 환경에서 게임 개발은 아직 시장이 포화되지 않은 장르이다. 그 만큼 게임 개발자에게 있어 매트로 환경에서 게임 개발은 매우 유혹적이기도 하다. 더 반가운 소식은 매트로 게임 개발에 필요한 지식은 게임 개발자에게 익숙한 C++언어와 DirectX다. DirectX를 이용하여 2D, 3D 게임을 개발할 수 있다.


얼마 전까지만 해도 Microsoft가 전략적으로 게임 개발을 지원하던 프레임워크인 XNA를 매트로 게임 개발에 지원하지 않는다. 대신 기존 게임 개발자에게 기존 개발 환경을 그대로 이어갈 수 있는 DirectX를 선택한 것이다.

Figure 5 DirectX 3D 샘플

[ VC11-C++11 ] chrono - 시간 측정하기

C++0x 2012. 7. 31. 10:41 Posted by 알 수 없는 사용자

chrono는 C++11에서 새로 추가된 시간 라이브러리입니다. 기존의 C 런타임에서 제공하는 time 함수에 비해서 다양한 기능이 있고, 사용이 쉽고 정밀도는 훨씬 높습니다. time 함수는 초 단위의 값만 측정할 수 있는 것에 비해 chrono는 나노 밀리 초 단위도 측정할 수 있습니다.

 

현재의 C++(C++03)에서는 초 단위보다 더 정밀한 단위로 시간을 측정할 때는 OS에서 제공하는 API를 사용해야 했는데 chrono를 사용하면 OS 독립적으로 높은 단위의 시간을 측정할 수 있습니다.

 

VC10에서는 chrono가 들어가지 않았지만 이번 VC11에서 chrono STL에 들어갔습니다. 만약 VC11을 사용하지 못하는 경우라면 Boost 라이브러리를 사용하면 사용할 수 있습니다.

 

chrono를 사용하면 특정 시간 구간에 걸린 시간을 초, 밀리 초, 나노 초 단위로 얻을 수 있으며 또 시간끼리 연산을 할 수 있습니다

 

 

 

chrono 사용 방법

 

chrono를 사용하기 위해서는 아래의 헤더 파일을 추가합니다.

#include <chrono>

 

 

chrono에 대한 자세한 설명에 앞서 어떤 기능인지 좀 더 쉽게 알 수 있도록 예제를 하나 보여드리겠습니다. 아래의 예제는 어떤 함수의 성능을 측정하기 위해서 chrono를 사용했습니다.

 

 

< 예제. 1 >

#include <chrono>

#include <iostream>

#include <cmath>

 

 

void Test()

{

           for ( long i = 0; i < 10000000; ++i )

           {

                     std::sqrt( 123.456L );

           }

}

 

 

 

int main()

{

 

    std::chrono::system_clock::time_point start = std::chrono::system_clock::now();

 

    Test();

          

    std::chrono::duration<double> sec = std::chrono::system_clock::now() - start;

 

    std::cout << "Test() 함수를 수행하는 걸린 시간() : " << sec.count() << " seconds" << std::endl;

 

    return 0;

}

 

< 실행 결과 >


 

<예제.1>에서는 std::chrono::system_clock::now()을 사용하여 현재 시간을 얻습니다.

 std::chrono::system_clock::time_point start = std::chrono::system_clock::now();

여기서 time_point 타입은 시간 상의 한 축을 뜻합니다.

 

 

 

이후 Test() 함수를 실행한 후 다시 현재 시간을 얻은 후 Test()를 시작하기 전에 저장한 현지 시간을 빼면 Test()를 수행하는 걸린 시간을 얻을 수 있습니다.

 

std::chrono::duration<double> sec = std::chrono::system_clock::now() - start;

  

* std::chrono::system_clock::now()에 의해서 얻는 시간의 초기 시간은 1970년 입니다.

 

 

 

시간 단위

chrono는 경과 시간을 계산할 때 다양한 시간 타입으로 계산할 수 있습니다.

 

<예제.1>에서는 초 단위의 정밀도로 소수점까지 표시할 수 있었습니다.

 

std::chrono::duration<double> sec = std::chrono::system_clock::now() - start;

 

그런데 보통은 소수점이 나오는 결과 값보다는 정수로 나오는 값을 사용하는 경우가 많을 것입니다.

 

 

chrono에서는 경과 시간을 나타내는 클래스는 duration입니다.

duration 6개의 시간 단위를 지원합니다.

 

std::chrono::nanoseconds  // 나노 세컨드. 10억분의 1

std::chrono::microseconds // 마이크로 세컨드. 100만분의 1

std::chrono::milliseconds   // 밀리 세컨드. 1000분의 1

std::chrono::seconds        //

std::chrono::minutes         //

std::chrono::hours           //

 

<예제.1>을 수정하여 위에 열거한 chrono의 다양한 단위를 사용하여 시간 측정을 해 보겠습니다.

 

< 예제. 2 >

#include <chrono>

#include <iostream>

#include <cmath>

 

 

void Test()

{

           for ( long i = 0; i < 10000000; ++i )

           {

                     std::sqrt( 123.456L );

           }

}

 

int main()

{

    std::chrono::system_clock::time_point StartTime = std::chrono::system_clock::now();

          

    Test();

 

    std::chrono::system_clock::time_point EndTime = std::chrono::system_clock::now();

 

 

 

    std::chrono::duration<double> DefaultSec = EndTime - StartTime;

 

    std::chrono::nanoseconds nano = EndTime - StartTime;

 

    std::chrono::microseconds micro = std::chrono::duration_cast<std::chrono::microseconds>(EndTime - StartTime);

 

    std::chrono::milliseconds mill   = std::chrono::duration_cast<std::chrono::milliseconds>(EndTime - StartTime);

 

    std::chrono::seconds sec                   = std::chrono::duration_cast<std::chrono::seconds>(EndTime - StartTime);

 

    std::chrono::minutes min                  = std::chrono::duration_cast<std::chrono::minutes>(EndTime - StartTime);

 

    std::chrono::hours hour                              = std::chrono::duration_cast<std::chrono::hours>(EndTime - StartTime);

 

 

 

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << DefaultSec.count() << " default" << std::endl;

 

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << nano.count() << " nanoseconds" << std::endl;

 

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << micro.count() << " microseconds" << std::endl;

 

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << mill.count() << " milliseconds" << std::endl;

 

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << sec.count() << " seconds" << std::endl;

 

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << min.count() << " minutes" << std::endl;

 

    std::cout << "Test() 함수를 수행하는 걸린 시간 : " << hour.count() << " hour" << std::endl;

          

    return 0;

}

 

< 실행 결과 >


[ VC11-C++11 ] enum - 전방선언

C++0x 2012. 7. 23. 09:00 Posted by 알 수 없는 사용자

unscoped enumeration scoped enumeration 둘 다 전방 선언을 할 수 있습니다.

 

아래와 같이합니다.

enum ITEMTYPE : short;

enum class CHARACTER_CLASS : short;

 

전방 선언을 할 때 unscoped enumeration은 타입 선언을 생략할 수 없지만 scoped enumeration은 타입 선언을 생략 할 수 있습니다.

 

아래 예제 코드를 보면 전방 선언을 올바르게 사용한 것과 잘못 사용한 예를 볼 수 있습니다.


< TypeDef.h >

 

#pragma once

 

enum ITEMTYPE : short

{

           WEAPON,

           EQUIPMENT,

           GEM                          = 10,

           DEFENSE,

};

 

enum class CHARACTER_CLASS1 : short

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

enum class CHARACTER_CLASS2

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

 

 

 

 

< Character.h >

 

#pragma once

 

enum ITEMTYPE : short;

//enum ITEMTYPE;                                          // 에러

//enum class ITEMTYPE : short;                       // 에러

 

 

enum class CHARACTER_CLASS1 : short;

//enum class CHARACTER_CLASS1;                  // 에러

//enum class CHARACTER_CLASS1 : int;           // 에러

//enum CHARACTER_CLASS1 : short;                // 에러

 

 

enum class CHARACTER_CLASS2;

 

 

 

struct Character

{

           ITEMTYPE m_ItemType;

          

           void SetItemType( ITEMTYPE Type );

 

 

           CHARACTER_CLASS1 m_Class;

          

           void SetClass( CHARACTER_CLASS1 CharClass );

};

 

 

 

 

< Character.cpp >

 

#include "Character.h"

#include "TypeDef.h"

 

 

void Character::SetItemType( ITEMTYPE Type )

{

           m_ItemType = Type;

}

 

void Character::SetClass( CHARACTER_CLASS1 CharClass )

{

           m_Class = CharClass;

}

 

 

[ VC11-C++11 ] enum - unscoped enumeration과 scoped enumeration

C++0x 2012. 7. 16. 09:00 Posted by 알 수 없는 사용자

C++11(새로운 C++ 표준의 이름) enum은 지금(C++03)과 다르게 두 가지의 enum이 있습니다.

바로 unscoped enumerationscoped enumeration 입니다.

 

 

unscoped enumeration

unscoped enumeration은 기존의 enum과 비슷한 것 이라고 생각 하면 좋을 것 같습니다.^^

 

 

unscoped enumeration은 아래와 같이 정의하고 사용합니다.

 

enum ITEMTYPE : short

{

   WEAPON,

   EQUIPMENT,

   GEM       = 10,

   DEFENSE,      // C++03까지는 에러이지만 C++11에서는 에러가 아님

};

 

사용은 아래와 같이

short ItemType = WEAPON;

 또는

short ItemType = ITEMTYPE::WEAPON; // C++03에서는 에러

 

 


scoped enumeration 

scoped enumeration은 아래와 같이 정의하고 사용합니다.

enum class CHARACTER_CLASS : short

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

사용은 아래와 같이 합니다.

CHARACTER_CLASS CharClass = CHARACTER_CLASS::WARRIOR;

 

그러나 아래는 에러입니다.

short CharClassType = FIGHTER; // 에러

 

scoped enumeration unscoped enumeration와 다르게 CHARACTER_CLASS를 생략하면 안됩니다. WARRIOR 이나 MONKCHARACTER_CLASS의 범위 안에 있음을 가리킵니다.

 

그리고 enum class 대신 enum struct을 사용해도 괜찮습니다. 타입을 지정하지 않으면 기본으로 int 타입이 됩니다.

 

 

 

형 변환

unscoped enumeration은 기존과 같이 암묵적으로 정수로 변환할 수 있습니다.

int i = WEAPON;

 

그러나 scoped enumeration은 명시적으로 타입 캐스팅을 해야합니다.

int i = static_cast<int>( CHARACTER_CLASS::WARRIOR);

 

 

 

< 예제 >

#include <iostream>

 

// unscoped enumeration

enum ITEMTYPE : short

{

           WEAPON,

           EQUIPMENT,

           GEM                          = 10,

           DEFENSE,

};

 

// scoped enumeration

enum class CHARACTER_CLASS : short

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

enum struct BATTLE_TYPE : short

{

           DEATH_MATCH              = 1,     

           TEAM,

};

 

int main()

{

           // unscoped enumeration

           std::cout << "ITEM WEAPON Type 번호 : " << ITEMTYPE::WEAPON << std::endl;

 

           short ItemType = EQUIPMENT;

           std::cout << "ITEM EQUIPMENT Type 번호 : " << ItemType << std::endl;

 

 

 

           /// scoped enumerations

           short CharClassType3 = (short)CHARACTER_CLASS::FIGHTER;

 

           CHARACTER_CLASS CharClass = CHARACTER_CLASS::WARRIOR;

          

           //short   CharClassType    = FIGHTER;                                  // 에러                                           

 

           //short   CharClassType2   = CHARACTER_CLASS::FIGHTER; // 에러

          

           //CHARACTER_CLASS       CharClass2    = WARRIOR;            // 에러

                            

           return 0;

}

 

 

[ VC11 ] 메모리를 절약하는 VC++11의 STL 컨테이너

Visual C++ 10 2012. 7. 9. 09:00 Posted by 알 수 없는 사용자

VC11 STL 컨테이너들은 이전 버전에 비해서 크기가 작아져서 메모리를 절약할 수 있게 되었습니다. 이전 버전과 다르게 VC11부터는 데스크탑 뿐만이 아닌 테블렛이나 스마트폰의 모바일 플랫폼 개발에서도 사용되므로 메모리 절약은 적지 않은 도움이 되리라 생각합니다.

 

아래 표는 x86(32비트 또는 ARM) x64(64비트) 플랫폼에서 각 VC 버전 별로 얼마만큼의 메모리를 사용하는 잘 표시하고 있습니다.

 

이 표는 VC11 뿐만이 아닌 이전 버전 사용자들에게도 도움이 될 것 같습니다. 저와 같은 서버 프로그래머들은 서버 프로그램이 설정한 동접자 수에서 어느 정도의 메모리를 소비할지 어느 정도 계산하고 있어야 하는데 이 표를 보면 메모리 계산할 때 도움이 될 것입니다

 

표의 바이트 사이즈는 Release 버전 기준입니다. 표에서 'VC9 SP1 SCL=0'SCL _SECURE_SCL를 뜻하는 것으로 원래 SCL은 기본은 1인데, 최고 스피드를 위해서 수동으로 SCL0으로 설정한 것입니다. VC10 VC11에서는 기본으로 _SECURE_SCL 0으로 되어 있습니다.

 



표의 출처는 MSDN입니다^^





[ VC11 ] 대격변(?) Visual C++ 11

Visual C++ 10 2012. 6. 25. 09:00 Posted by 알 수 없는 사용자

드디어 Visual Studio 2012(이하 VS2012) RC판이 나왔습니다(사실 꽤 되었죠^^;). 

이번 VS Visual C++(이하 VC++)의 버전은 11이 됩니다.

 

한동안 Visual C++은 변화가 거의 없다가 VC++ 9(VS 2008)에서 변화의 조짐을 보이다가 VS 2010에서 새로운 C++ 표준인 C++11(그 당시에는 C++0x라고 부름)과 병렬 프로그래밍, 툴의 기능 강화를 통해서 이전에 비해서 큰 변화를 이루었습니다.

또 이번 VS 2012에서도 VS 2010 버전 이상으로 큰 변화가 생겼습니다. 변화는 대격변이라고 부를 수 있을 정도입니다!.

 

 

이번에는 다음과 같은 변화가 있습니다.

 

1. Windows 8 Metro 앱 개발

아주 큰 변화 중의 하나입니다. 정식 제품이 가을쯤에 나올 Windows 8 Metro Windows Phone 8용 앱을 C++을 사용하여 개발할 수 있습니다. 이것을 위해 WinRT라는 새로운 플랫폼 API C++/CX가 새로 생겼습니다.

 

2. 툴 기능

다양한 C++ 토큰들에 다양한 색을 지정.

찾을 요소를 눈에 잘 뛰게 해준다.

편의 기능이 코딩 시 멤버 선택.

인텔리센스에서 C++/CLI 지원.

코드스니펫을 이용한 고속 코딩.

 

3. C++11 지원

이번에는 코어 언어 기능 보다는 라이브러리 기능이 더 중심이 되었습니다. 그러나 코어 언어에서 VC++ 10에서 큰 사랑을 받은 auto에 버금가는 range-based for loop가 있습니다. 그리고 라이브러리에 Thread가 추가 되었습니다. 이번에는 공부할 것이 많습니다 ^^;

 

4. 컴파일러 개선

CPU 개수에 맞추어 컴파일 속도가 향상.

Auto-Vectorizer 의한 프로그램 성능 향상.

 

5. 병렬 프로그래밍

기존의 병렬 라이브러리 개선.

새로운 디버깅 및 시각화 기능에 의해 쉽고 올바른 병렬 프로그래밍 진단.

GPU 병렬 프로그래밍을 위한 C++ AMP 추가.

 

6. 네이티브 유닛테스트 프레임웍 추가

사제가 아닌 마이크로소프트 순정의 유닛테스트 프레임웍!!!.

 

 

 

이렇게 VC++ 11의 새로운 기능을 정리해 보았습니다. 제가 대충 큰 것만 정리했는데도 공부할 것이 많지 않습니까?^^; 한번에 다 하면 부담되지만 조금씩 하면 충분히 공부할만한 분량입니다. 아직 정식 버전이 나오지 않았으니(가을쯤에 나온다고 합니다) 여유를 가지고 지금부터 조금씩 천천히 공부해 보죠^^

 

 

 

 

 

ps 1: VC++의 각 버전 별 내부 버전 번호와 코드에 정의된 버전

브랜드 버전                  내부 버전          #define _MSC_VER 버전

Visual C++ 2005            VC8                 1400

Visual C++ 2008            VC9                 1500

Visual C++ 2010            VC10                1600

Visual C++ 2012            VC11                1700

 

 

ps 2: 실행 환경

위에는 VC++11의 좋은 점만 이야기 했지만 개인적으로 걱정되는 것이 있습니다. 가장 큰 문제가 실행 환경입니다. VC++11Windows Vista 이상에서만 실행되고 또 VC++11을 이용해서 만든 프로그램도  Windows Vista  이상에서만 실행할 수 있습니다.

Windows 8 Metro 앱 개발을 하거나 저처럼 서버 개발을 하는 개발자에게는 큰 문제가 되지 않을 수도 있지만 클라이언트 개발자에게는 이 부분이 VC++11을 사용하는데 큰 걸림돌이 되리라 생각합니다

 => 그런데 VC++ 팀블로그를 보니 많은 고객들이 XP 지원을 요청해서 가을쯤에 업데이트를 통해서 XP도 지원해 준다고 합니다.^^ 

http://blogs.msdn.com/b/vcblog/archive/2012/06/15/10320645.aspx

이로써 큰 고민을 하나 해결 되었네요^^

 

이제 이 정도면 우분투에서 개발하기 위한 환경으로 쓰기에 큰 부족함은 없을 겁니다. 단지 부족한 면이 있다만 LibreOffice로 오피스 작업은 어느 정도 가능하지만, OutLook과 같은 강력한 오피스 소프트웨어가 없는 것이 아쉽네요.

이제 Mono개발 도구인 MonoDevelop과 몇 가지 유용한 소프트웨어를 찾아서 설치해 봅시다. 이번에는 우분투의 "우분투 소프트웨어 센터" 를 통해 설치하려고 합니다. 지금까지 터미널로 작업했던 소프트웨어 설치 작업은 이 우분투 소프트웨어 센터를 통해 가능합니다만, 터미널은 리눅스 사용에 있어서 꼭 익숙해져야 하기에 좀 고생해서 터미널로 작업을 한 것이니, 이 전의 터미널 작업들은 꼭 반복해서 외우시기 바래요.

   

먼저 아래와 같이 프로그램에서 우분투 소프트웨어 센터를 실행합니다.

   

우분투 소프트웨어 센터의 검색에서 "mono"라고 검색해 보세요. 많은 Mono와 관련된 소프트웨어가 검색이 됩니다.

   

오호! 저 아래에 MonoDevelop이 보이는군요. 자자! 잠시 바로 설치를 누르시 마시고, "더 많은 정보" 버튼을 클릭해 보세요.

   

설치 작업은 관리자의 권한이 필요하므로 암호를 입력해 줍시다.

   

그럼 아래와 같이 "확장 기능"이 보이는데요. 걍 모두 선택해서 설치하세요. 모두 피가 되고 살이 되거나, 어쩌다가 한번씩 필요한 기능들입니다.

   

그리고 "우분투 소프트웨어 센터에서" 아래의 몇 가지 추가적인 소프트웨어도 설치해 줍시다.

  • Mono IL Contract
  • Mono Runtime
  • Mono Documentation
  • Mono Runtime (Terminal)
  • gsharp
  • Monodoc (Http)

   

이쁘게 Mono Develop이 설치가 되었네요.

   

실행시 켜보시면 아래와 같이 MonoDevelop이 실행이 됩니다. 깔쌈한 화면이 금방이라고 코드를 짜고 싶어지네요. 이것 저것 한번씩 만져보시고 Visual Studio와 비교해 보시면서 좋은 점, 나쁜점을 찾아보시면 더 재미있겠죠?


여기까지 따라오시면서 우분투의 사용자 인터페이스와 몇 가지 명령어가 어느 정도 자연스러워 지셨는지요? 몇 번 우분투를 사용해 보시면 알겠지만, "우분투 소프트웨어 센터"에서 필요하신 소프트웨어를 편하게 모두 다운로드 받으실 수 있답니다. 급하신 분들은 먼저 개발 도구와 툴 들을 설치하셔도 됩니다. ^^*

어제 오늘 할 것은 우분투의 테마를 좀 바꾸어볼까 합니다. 기본 테마가 나쁘지는 않지만, 제가 주로 사용하는 개발 툴은 아이콘을 크기를 줄이고, 더 넓은 화면으로 쓰고 싶습니다. 이럴 때 유용한 소프트웨어가 있으니, 다음의 링크를 참고하시기 바랍니다.

   

Gnaom Classic 테마입니다. 다음의 링크에 자세한 내용을 소개하고 있습니다.

http://ioriy2k.pe.kr/archives/4357

   

   

자! 그럼 설치 후 재 부팅을 하면 로그인 화면이 나타납니다. 여기에서 아래의 그림과 같이 사용자 이름 오른쪽의 아이콘을 클릭해 보세요.

   

Gnome Classic 테마를 선택하시고 로그인을 합니다.

   

   

호호~! 아래와 같이 예쁘게 테마가 바뀌었습니다. 약간 MAC OS와 같은 스타일 비슷하네요.

좌측 상단의 영역은 윈도우의 "시작" 과 비슷한 기능으로 소프트웨어의 목록을 볼 수 있습니다.

오른쪽 상단은 뭐 그 전과 지금과 마찬가지고요.

좌측 하단에 아이콘을 DRAG&DROP 하시면 빠른 아이콘으로 등록하실 수 있습니다. 아이콘을 우측 하단쪽으로 등록하시면 좌측/우측으로 정렬하여 빠른 아이콘을 등록할 수 있답니다.

그리고 마지막으로 오른쪽 하단은 4개의 네모 상자가 보이는데요. 이것은 가상 윈도우로 윈도우 화면을 너 넓게 쓸 수 있답니다. 단축키를 쓰는게 더 빠르겠죠? CTRL+ALT+상/하/좌/우 로 빠르게 쓸 수 있습니다.


윈도우 서버의 Active Directory로 전사적인 리소스를 관리하는 회사가 많이 있을 겁니다. 그래서 로그인을 도메인 계정으로 로그인을 해야 할 필요가 있는데, 우분투에서는 likewise 로 도메인 서비스에 가입하여 로그인을 할 수 있답니다.


도메인 계정으로 로그인해야 하는 환경이 아니라면 패스!!

   

도메인 가입

우선 도메인을 가입하기 위해 필요한 likewise-open 패키지를 다운로드 받아 설치합시다.

다음과 같이 입력하세요. sudo apt-get install likewise-open

   

이제 도메인에 가입할 도메인 주소와 도메인 계정을 알고 있으면 됩니다. 저는 저희 집에 Active Directory가 POWERUMC.KR 주소로 되어있습니다. FQDN 은 대소문자를 구분하니 정확히 입력하셔야 합니다.

   

다음과 같이 입력합니다. sudo domainjoin-cli join POWERUMC.KR umc

=> sudo domainjoin-cli join 도메인주소 도메인계정

   

그리고 도메인 계정의 비밀번호를 입력하면 도메인 가입이 완료가 됩니다.

다음과 같이 입력합니다. sudo /etc/init.d/likewise start

   

   

관리자 권한으로 변경

일단 현재 머신으로 도메인에 가입하였고, 현재 머신에 해당 도메인 계정을 관리자 계정으로 줍시다. 이건 뭐 윈도우에서도 마찬가지죠? ^^

   

다음과 같이 입력합니다. sudo adduser POWERUMC.KR\\umc admin 또는 administrator

 

   

SUDO 권한 주기

말씀 드렸던 최고 관리자 권한으로 명령을 실행하기 위해 sudo 라는 명령을 쓴다고 말씀 드린바 있습니다. 이 sudo 도 이를 사용할 수 있는 계정을 구분해 주는데, 도메인 계정으로 sudo 를 사용할 수 있게 해야 합니다.

먼저 root 권한으로 로그인을 해볼까요? 굳이 로그 오프하지 마시고, su 명령으로 다른 계정의 권한으로 변경할 수 있습니다.

   

다음과 같이 입력하세요. sudo su root

   

sudo 명령을 사용할 수 있는 권한들은 sudoers 라는 파일에 텍스트로 기록이 됩니다. 이 파일을 편집할 수 있는 사람은 최고 관리자 권한인 root 밖에 없답니다.

다음과 같이 입력합니다. sudo gedit /etc/sudoers


여기까지 오시는데 조금 지치지는 않으셨나요? 그래도 리눅스의 몇 가지 시스템에 대해서 알아가는 과정이니 빠득 빠득 따라오시기 바랍니다. 뭐 윈도우에서도 개발 환경 세팅 하려면 어느 정도 시간을 투자해야 하니까용~

 

   

자 이제 다 되었습니다. sudo clear를 입력하여 오류가 나지 않으면 설정이 올바르게 된 겁니다. clear 명령은 화면을 깨끗하게 지우고 커서를 최상위로 옮기는 명령인데, 윈도우에서는 cls 랑 맘먹는 놈입니다.

다음과 같이 입력하세요. sudo clear


이 부분은 우분투의 한글 드라이버인 ibus가 좀 오동작을 합니다. 쩝.. (한글 입력기라고 부르는군요.).

안 불편하시면 걍 쓰시고, 전 불편해서 다른 한글 입력기로 바꿀겁니다.

   

다음과 같이 입력해서 앱 스토어에서 nabi 한글 입력기를 다운로드 받습니다. (앱 스토어는 그냥 친숙한 의미로 부르는 것이니, 또 이런 문장 문장 하나에 죽자고 덤비지 마시길)

   

다음과 같이 입력하여 nabi를 설치합니다. sudo apt-get install nabi

   

   

    


혹시 노트북을 쓰신다면,

한글 키보드 101/104 가 ALT L과 한/영 키를 구분 못하는 경우가 있습니다. 그래서 ALT L 단축키를 다른 키로 변경할겁니다. 그래야 한/영 키가 올바로 먹습니다.

   

   

윈도우 키 + Space 로 변경

영어 울렁증이 있으시다면 한글 우분투로 변신시켜 봅시다. 영어 버전도 충분하시면 패스!!

   

   

   

   

   

   

   

   

   

   

재 부팅 후


이제 우분투에 로그인이 되셨습니까? 그럼 우분투에서 매우 자주 쓰는 몇 가지 명령어를 터미널을 이용해서 작업을 할겁니다. 우분투는 X-Windows 환경도 좋지만, 리눅스답게 터미널을 못쓰면 리눅스답게 쓰기가 힘들 수 있습니다.

터 미널 작업은 매우 강력하고, GUI 기반+마우스 작업으로 하는 것보다 훨씬 빨라서 터미널이 점점 재미있어질 겁니다. 윈도우의 커맨드 라인 작업은 왠지 지루한 감이 있지만, 리눅스의 터미널 작업은 왠지 즐기게 되는… 음… 그 기분… 아마 써보지 않은 분들은 못 느끼실 겁니다.

   

   

터미널 실행하기

아래의 마우스 위치가 바로 "Dash Home" 아이콘 입니다. 그곳을 클릭해서 terminal을 검색하시면 됩니다. 근데 CTRL+ALT+T 키를 누르면 바로 터미널 뜬답니다.

   

   

ROOT 계정 비밀번호 설정

   

우 선 root 계정의 비밀번호부터 변경해 봅시다. root 계정은 윈도우의 administrator(관리자), 우분투의 admin 보다 더 계급이 높은 계정입니다. 원래 우분투에서는 root 계정은 사용하지 않는 것이 관례인데, 필자가 뭔가 작업을 잘못해서 이를 되돌리려니 root 권한을 얻지 못해서 큰 코 다친 적이 있습니다. 그래서 그 후 부터는 root 계정을 살려놓죠 ^^; 우분투를 써보신 분들은 아실만한 내용인데, sudoers 파일에 오타를 넣어 저장을 해버려서, sudo 를 실행하지 못해 완죵 고생했었죠.



sudo, 수도 꼭지의 수도가 아닙니다. sudo 는 우분투를 쓰면서 가장 많이 쓸 명령어인데, 이 명령어는 보안과 관련된 부분에서 최고 관리자 권한(root)의 을 얻는 명령입니다. 이와 비슷한 윈도우의 명령어는 runas.exe 가 있지요.

   

리눅스 : sudo cp * /usr/local/umc <--- 최고 권한으로 모든 파일을 umc 디렉토리로 복사하라!

   

이 명령어를 윈도우와 유사하게 사용하면 이렇게 됩니다.
윈도우 : runas /user:administrator copy * C:\user\umc\documents

   

다음과 같이 입력하세요. sudo passwd root

   

   

RPM 과 APT-GET

RPM! 이건 또 머꼬! RPM(Redhat Package Manager) 로 레드헷(유형의 회사나 단체)에서 만든 리눅스인데, 좀 먹어주는 리눅스 버전입니다. 레드헷 계열은 대부분 상용적인 서비스를 목표로 만든다고 하네요. 이 RPM으로 뭔가의 패키지를 자동으로 설치해 줍니다. 윈도우에 비교하자면 MSIEXEC 와 비슷하지만, GUI 기반이 아니라는 점이 다르지요.

그리고 apt-get 이 있습니다. apt-get(Advanced Packaging Tool)은 인터넷을 기반으로 패키지를 설치하는 방법입니다.

   

자! 정리하면 RPM은 로컬 실행용 패키지! APT-GET은 인터넷 앱 스토어(?)에서 다운받아 설치하는 방식!

이 apt-get 은 먼저 update 를 해주어야 합니다. apt-get 은 소스 서버에 있는 소프트웨어 목록 등을 인덱싱하여 캐싱합니다.

다음과 같이 입력합니다. sudo apt-get update

   

그리고 RPM 을 설치합니다. 다음과 같이 입력합니다. sudo apt-get install rpm

   

   

   

apt-get 소스 서버 변경

이건 해도 되고 안해도 됩니다. 다만 소스 서버를 좀 더 빠른 곳으로 바꾸면 apt-get 설치가 좀더 빨라지겠죠.

   

   

   

역시 우리나라의 소프트웨어 회사인 다음 서버군요. 멋집니다. 다음!

   

소스 서버가 변경되었습니다. 다시 캐시를 업데이트 해야겠지요?

다음과 같이 입력합니다. sudo apt-get update


첫 회부터 너무 쌘건가? 독자 분들도 제목에서 볼 수 있듯이 "크로스 플랫폼 개발 환경 만들기"라는 주제인데, 혹여 뭔가 대단한 것을 만들려고 하는 것은 아니니 너무 큰 기대는 하지 않길 바랍니다. 이 글은 필자가 크로스 플랫폼 개발 환경을 만들면서 여러 번 수행 착오를 겪은 부분을 공유하기 위함입니다.  

일단, 크로스 플랫폼 개발 환경을 만들기 위해 필자가 선택한 운영체제는 우분투 12 LTS 버전입니다. 맥OS는 리눅스 기반이면서 맥에서만 100% 설치 성공 가능한 운영체제입니다. 뭐 해적판도 있겠지만, 그런 고생은 불법적인 방법이므로 피하는게 좋겟지요.  

우분투12를 선택한 김에 우분투 운영체제에 대한 소개 좀 해봅니다. 우분투는 리눅스라고 하는 수 십 년 전 멀티 테스킹(멀티 쓰레딩)을 지원하는 운영체제 입니다.

   

필 자가 리눅스를 접했던 때는 초등학교 때였는데, 그 때는 플로피디스크 4장으로 설치를 하던 까만 바탕화면의 그런 운영체제 였습니다. 초롱불 같은 좀 허접한 사설 BBS를 날로 뚫었던, 난 "크래커야!" 라는 뿌듯한 자부심으로 사용하던 것이 바로 리눅스였습니다. 더불어 리눅스는 소스 코드가 공개가 되어 있어서 상당한 보안 취약점이 존재했습니다. 그 중에서도 vi 와 같은 것들은 해커들이 가장 좋아하던 공격 대상이었지요. 그러면서 리눅스에 X-Windows 라고 하는 GUI 그래픽 인터페이스이 탑재가 되었고, 쭉쭉 발전해서 현재와 같은 모습이 되었습니다.

   

우분투데비안 계열에서 파생된 운영체제 입니다. 또 데비안은 머꼬?? 이 데비안 리눅스는 굉장히 많은 CPU의 아키텍처를 지원하기 때문에, 서버 용도로 안성맞춤이었죠. 심지어 ARM 코어도 지원하고, 듣도 보지도 못했던 아키텍처들도 지원을 하네요.  

데비안에서 파생된 우분투는 이러 저러 잡다한 것들 다 빼고, 사용자가 친숙하게 사용하기 위한 용도로 설계가 되었고, 데스크 탑 용도로는 안성 맞춤이지요. 이 우분투는 서버와 데스크 탑 용이 별도로 존재하는데, 그 중 데스크 탑 우분투는 가장 널리 사용되는 X86과 AMD64 아키텍처를 지원합니다. 쩝.. 그러니까 여러 분이 가진 PC나 노트북에서는 다 돌아 가겠고요. ARM 코어 컴퓨터가 있으면 당장이라도 ARM 코어를 지원하는 우분투 서버 버전을 이용하시면 되겠습니다. 아무튼 쥑이는군요.

   

  

사설은 여기서 마치고, 일단 설치부터 해보아야겠지요? 우분투는 2가지 방식의 설치를 지원합니다. 매우 중요한 부분이지요.

   

첫 번째, 설치 방식은 별도 파티션을 나누지 않고도 멀티 부팅이 가능한 우비(wubi) 버전입니다. 우비는 NTFS 파일 시스템(일반적으로 윈도우에서 쓰는)을 마치 물리적인 파티션으로 인식하도록 하여, 설치를 합니다. 가령, C:\ubuntu 폴더가 하나의 파티션이 되는 것이지요. 그냥 짬짬히 쓸 생각이라면 우비 버전으로 설치하시면 되겠습니다.

두 번째, 가장 일반적인 파티션을 분할하여 설치하는 방법입니다.

   

아참… 여기서 아마 VirtualBox나 HYPER-V에 설치하려고 하는 분 계실 겁니다. 제가 정말 장담하건데 개인용 컴퓨터에서 가상화하여 설치하면 얼마 못가서 지울 겁니다. 그리고 제 성능도 안나옵니다. 영화를 아이폰으로 보는 것과 iMAX 로 보는 것과의 차이입니다. 꼭 한번쯤은 우비나 파티션을 나누어서 설치해 보세요. 후회하지 않을 겁니다.

   

   

   

   

첫 번째, 우비(wubi) 버전으로 설치해 봅시다. (구경만 해보실 분)

먼저 http://www.ubuntu.com/download 링크로 가봅시다. 아래에 우분투 데스크탑 버전으로 클릭합니다.

   

그리고 화면 스크롤은 반 쯤 내려보세요. 그럼 "Windows Installer" 설치 다운로드가 보입니다. 요거 그냥 따블 클릭해서 실행 파일을 실행하면 됩니다. 아까 얘기한대로 이것을 설치하면 가상 파티션이 생성되어 멀티 부팅이 가능합니다. 그리고 "소프트웨어 설치/제거"에서 wubi 를 삭제하시면 우분투도 금방 삭제가 됩니다. 정말 획기적입니다.

   

아래와 같이 설치할 드라이브와 적당한 가상 파티션의 크기를 지정해 주세요. 왠만하면 30GB 선택해 주시면 되겠습니다. 그리고 설치하기를 선택하시고 그 이후의 일은 여러분에게 맡기겠습니다….

   

   

   

   

두 번째, 진정한 리눅스의 성능을 느끼시려면, 파티션을 나누어 설치를 해야겠지요.

먼저 http://www.ubuntu.com/download 링크로 가서 설치하고자 하는 우분투 버전을 선택하면 됩니다. (32bit, 64bit 택일). 32bit 가 추천으로 되어있지만, 필자는 추천 항목은 안씁니다^^. 그래서 저는 64bit 버전을 선택해서 ISO 파일을 다운로드 받았답니다.

   

   

이 ISO 를 USB나 CD로 구우시면 되겠습니다만, USB로 구우실 거면 이 http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/ 링크에서 USB로 금방 구워주는 소프트웨어를 사용해 봅시다. 이 소프트웨어는 아래처럼 생긴 물건입니다.

   

그리고 설치할 파티션을 미리 확보하시기 바랍니다. 용량이 모자라시면 파티션 축소하셔서 남은 용량을 짜 내시면 됩니다. 물론 파티션은 "주 파티션"으로 만들어야겠지요?

그리고 아래의 스크린 샷을 쭉쭉 보시면서 설치하시면 됩니다. 쭉쭉 보시다가 중요한 부분에서 다시 말씀 드리겠습니다.

   

   

   

   

   

   

자 여기에서 당황하지 마시고, 아래와 같이 멀티 부팅이 가능하도록 첫 번째 항목을 유지한 채 다음으로 넘어가면 됩니다.

   

그러면 아래와 같이 칸막이 조절 막대가 있는데, 참 애매해 보이네요. 파티션 이름이나 파티션 주체에 대한 내용이 나오지 않아 혼란스럽습니다. 아래에 "고급 파티션 도구" 보이시죠? 그냥 고급 파티션 도구를 써서 설치해 봅시다.

   

설치를 시작하기 전에 파티션을 마련해 놓으라고 했는데, 여기에서 그 파티션을 선택하면 되겠군요. "주 파티션"으로 설치하면 멀티 부팅이 됩니다. 그리고 리눅스에서 즐겨 쓰는 EXT4 파일 시스템을 선택하고, 마운트 위치를 / 로 잡아줍니다.

   

여기서 잠깐 파일 시스템에 대해서 얘기하자면, 윈도우에서는 NTFS 파일 시스템을 사용하죠. 과거 FAT 파일 시스템은 최대 디스크 용량과 파일 길이에 제한이 있었고, 점점 파일들의 크기가 증가하면서 파일당 할당되는 블록이 점점 높아졌습니다. FAT16, FAT32가 대표적이죠. 쉽게 말해 MS-DOS 에서 주로 기반한 파일 시스템이었죠. FAT16 시절에는 파일명 최대 8, 확장자 최대 3… 8.3 법칙이랍니다.

이후 윈도우에서 NTFS 파일 시스템이 나왔습니다. NTFS 파일 시스템으로 암호화를 한다던가, 복구를 한다던가 하는 작업이 가능합니다.

반면, 우분투에서는 EXT 파일 시스템을 주로 사용하는데, EXT4 파일 시스템으로 포멧하시고 설치하시면 됩니다. 혹시 구형 하드 디스크인 경우 EXT2 를 선택하시면 되겠고요.

아 참… 중요한 마운트라는게 있는데, 이는 디렉토리 단위로 관리되는 디바이스라고 보시면 됩니다. 윈도우에서는 C드라이브, D드라이브로 구분이 됩니다. 하지만 리눅스에서는 마운트라고 하여 물리적인 디바이스 단위를 논리적으로 트리 형태의 디렉토리로 관리됩니다. 쉬운 예를 들면, / 는 첫 번째 하드 디스크이고요, /dev/NewDrive 는 새로 산 하드 디스크를 붙였습니다. CD-ROM 도 붙여 볼까요? /dev/cdrom 위치에 놓을 수 있습니다. 원하는 위치에 마운트 시킬 수 있다는 것이죠.

   

   

자 그럼 이제 설치합시다. 그 전에 아래의 붉은 동그라미에 설치가 되므로, 올바르게 멀티 부팅이 되기 위해서 주 파티션을 제대로 선택했는지 재차 확인 합시다.

   

   

키보드는 별탈 없으면 101/104로 선택하세요. 차후에 정신건강에 이롭습니다.

   

사용자 이름과 컴퓨터 이름은 원하는대로 입력하고 후닥 넘어가시죠.

   

   

   

   


 2012년 4월 26일, 고대하던 우분투 12 LTS 가 릴리즈 되었습니다. 우분투는 데비안 계열에서 파생된 사용자에게 친숙한 데스크탑 운영체제입니다. (더 자세한 내용은 이 링크를 참고하세요) 왜 갑자기 쌩뚱맞게 우분투 얘기가 나오는 것인가라고 의아할 수 있을 겁니다. 이유는 우분투에서 Mono를 이용하여 크로스 플랫폼을 지원하는 소프트웨어를 만들자는 것에 의미가 있습니다.

 

  

 

 

그 중, Mono는 .NET 플랫폼과 .NET Framework를 충실하게 구현한 오픈 소스이며, 크로스플랫폼을 위한 내부적인 기술 및 지원은 오히려 .NET 보다 앞섭니다. .NET의 복제품이 아닌, .NET의 확장판으로 보시기 바랍니다. .NET 플랫폼이라는 어떤 무형/유형의 구현체는 ECMA라는 비영리 표준화 기구와 ISO인 국제 표준화 기구에서 표준으로 정의되고 있습니다. 즉, Mono는 표준화 기구에서 인정한 표준을 구현한 것일 뿐이며, Microsoft 와는 어떠한 라이선스 관계도 맺지 않는 자유 소프트웨어 진영입니다.
(정확히 비표준 및 표준에 등재된 것들은 언어 스팩과 CIL 스팩입니다. 그 외적인 CLR 부분은 Mono가 크로스 플랫폼을 위해 자체적으로 구현한 레벨이 되겠지요. 전반적인 내용의 의도만 이해하시기 바랍니다.)


   

자체적으로 .NET Framework과 CLR(Common Language Runtime), CIL(Common Immutable Langauge), JIT(Just in Time) 등을 크로스 플랫폼에서 동작하도록 매우 심혈을 기울여 탄생한 독자적인 플랫폼입니다.

더불어 Mono가 혼자서 모든 것을 한 것이 아닙니다. 자유 소프트웨어 진영의 GTK(그래픽 툴 킷)을 이용하여 데스크탑 응용 프로그램을 리눅스, 윈도우, 맥, 모바일에서 돌릴 수 있습니다. 또한, ASP.NET 웹 응용 프로그램을 Apache Tomcat, FastCGI, 또 최근에 높은 성능으로 주목을 받고 있는 Nginx 와 같은 WAS(Web Application Server)에서 돌릴 수 있습니다.

 

  자 유 소프트웨어 진영의 훌륭한 운영체제와 어디에서나 돌아가는 개발 환경 및 서버 운영 환경의 크로스 플랫폼 인프라.. 그 동안 Microsoft가 제공하는 편안한 윈도우 운영체제와 IIS(Internet Information Service) 이 두 가지에 의존하며 개발하던 우물안의 개구리에서 이제는 더 큰 곳을 바라보아야 할 때인 것 같습니다. 그것을 시작하는 첫 걸음이 바로 Mono 입니다.

 

이 쯤에서 Mono 플랫폼과 그 인프라의 장점을 한번 살펴봅시다.

1. Mono 플랫폼 전체가 오픈 소스이며, 그 구현체는 매우 수준이 높고 확장 가능합니다. (.NET 플랫폼과 비교하여)

2. MonoDevelop라는 통합 개발툴(IDE)은 무료이며, 리눅스, 윈도우, 맥 등에서 설치하여 쓸 수 있습니다.

3. 운영체제 구매 비용이 없고, 웹 서버 구매 비용이 없습니다. 4. 호스팅 업체에서 우분투와 같은 리눅스(Linux) 호스팅 vs 윈도우 호스팅의 가격 = 1개월당 각각 1,000원 : 20,000원입니다. Linux는 쓸수록 금전절약입니다.

5. 가볍습니다. 운영체제 용량과 개발 환경 구성을 모두 다 해서 7.4GB 입니다.
(현 재 설치된 것들이 우분투 12 LTS, Gnome시리즈 유틸, Mono Runtime, MonoDevelop, JDK6, JDK7, OpenJDK6, OpenJDK7, Eclipse, STS(SpringSource Tool Suite), IntelliJ, NetBeans, KDevelop, Qdevelop 등등 )

6. 윈도우 기반의 .NET 응용 프로그램은 체감적으로 모든 것이 느립니다. 하지만 리눅스에서는 체감 실행 속도가 더 빠른 것 같습니다. (윈도우용 MonoDevelop보다 리눅스용 MonoDevelop 실행 속도가 나은 것 같습니다.-컴파일, 실행속도 등등)

   

 

이쯤에서 한 가지 알기 힘든 궁금증이 생깁니다. "왜 마이크로소프트는 충분히 기술력이 있음에도 크로스 플랫폼을 포기할까?". 정말 왜일까요? 언뜻 생각해보면 당연히 자사 운영체제에 특화되어야 혁신적인 기능이나 기술이 빠르게 추가될 수 있습니다. .NET Framework만 보아도 WINAPIs와 COM로 도배되어 있고, WCF만 보아도 IIS나 윈도우 서비스에서 편하게 쓸 수 있도록 하였으며, 알 수 없는 NetTcp, NetNamed, NetMsmq, MsmqIntegration 비표준 웹서비스 프로토콜을 사용하지요. 물론 이런 것들이 필요에 의해서 나오긴 했지만, 윈도우라는 족쇄에 묶어둘 수 있는 좋은 기술이기도 합니다.

   

   

그리고 오픈 소스 진영의 라이선스 정책이 마이크로소프트가 크로스 플랫폼을 지원하지 못하게 되는 장벽이 될 수도 있습니다. GPL이냐 LGPL이냐, 또는 정적 링크냐 동적 링크냐, 무료 배포이냐 상용 배포이냐에 따라 마이크로소프트의 제품의 상표권이 문제가 될 수도 있고, PDB 심볼에 원작자의 요구 문건이 포함될 수 있고, 최악의 경우에는 상용 소프트웨어의 소스 코드를 공개해야 할 수도 있을 겁니다. 물론 잘 알아보고 써야겠지만, 언젠가는 라이선스 정책은 변경이 될 수 있지요. 그런 오픈 소스 진영의 라이선스 정책 등으로 휘말리지 않는 방법이 독자 플랫폼으로만 살아가는 것일 겁니다.

하지만, 이제는 세상이 변해가고 있습니다. 초기에 아이폰의 iOS와 안드로이드 앱을 서로 다른 기술로 구현을 해야 했지만, 이제는 그런 개고생은 하지 않아도 되었습니다. C#이라는 언어만 알고 있으면, Mono for Android로 안드로이드 앱을 만들고, 이 코드를 재사용하여 MonoTouch for iOS로 아이폰 앱도 만들 수 있겠지요. 이 코드를 재사용하여 Windows Phone 앱도 만들 수 있겠죠.

   

필자는 BASIC, QBASIC, Turbo BASIC을 죽도록 해 본적이 있습니다. 그리고 Turbo C를 죽도록 해 본적이 있습니다. 그리고 Turbo Pascal을 죽도록 해 본적이 있습니다. 그리고 거의 7년 동안 .NET과 C#, ALM, Testing을 죽도록 한적이 있습니다. 그리고 최근에는 JAVA, Python, C++ COM 을 죽을 만큼은 아니고 적당히 공부하고 있습니다. 그 전에는 즐겨 사용하던 C#이라는 언어의 철학을 이해한다고 했지만, 이해하지 못했습니다. 다만, 이제서야 조금은 이해가 갑니다.

   

아주 작은 예를 들면,

왜 C# 언어의 람다식이 JAVA 언어의 람다식보다 좋은가?
왜 C# 언어의 Attribute이 JAVA 언어의 Annotation보다 좋은가?
왜 C# 언어의 익명 메소드가 JAVA 언어의 익명 메소드보다 좋은가?
왜 .NET의 보안 모델이 JAVA의 보안 모델보다 좋은가?

물론 JAVA가 더 좋은 것도 많답니다. 오해 마시길…

   

가장 큰 주제의 질문으로써, 왜 윈도우보다 크로스 플랫폼이 좋은가?

   

우 리가 사용하는 .NET 플랫폼이 생산성이 좋고, 성능이 좋고…를 우물 안에서 외치며 섣불리 판단하는 노예 아닌 노예가 되지 맙시다. 이제야 저도 느끼는 것이지만, 그런 바보 같은 사람이 되지 않기를 바랍니다. 자신의 종교만이 유일한 신이니까, 다른 종교를 무시하면 그 사람만큼 불쌍해 보이는 사람도 없습니다. 진정 과학이 발달하여 "신 같은 것은 없어!! 우리는 외계인의 후예!!" 라면… 완전 반전이죠^^; (과학적으로는 이런 얘기들의 이론이 뒷받침 되고 있습니다.)

   

현재 스스로 개발자라면 스스로에게 무언가의 질문을 던져볼 시기인 것 같습니다.

저와 함께 우분투 운영체제에 MonoDevelop을 써보느냐!! 아니면 윈도우에 Visual Studio를 쭉 쓰느냐!!

   

앞으로 총 11회의 연재를 통해 당신을 우분투와 MonoDevelop를 주무르는 멋진 개발자로 만들어 드리겠습니다.

기대해 주세요….