title: "**C++/CLI: .NET 프레임워크 프로그래밍을 위한 가장 강력한 언어(1/2)**"
description: "**C++/CLI: .NET 프레임워크 프로그래밍을 위한 가장 강력한 언어(1/2)**"
cleanUrl: /sw-engineer/intro-cplusplus-cli-1
ogImage: ""
floatFirstTOC: right

<aside> 💡 본 글은 MSDN에 올라온 "C++: The Most Powerful Language for .NET Framework Programming"의 번역문입니다.

</aside>

Written by Kenny Kerr

요점

: Visual C++ 2005에서 새로이 소개되는 C++/CLI 언어의 설계와 원리에 대해 탐구해봅니다. .NET 프로그래밍을 위한 가장 강력한 언어 - C++/CLI - 를 이용하여, 파워풀한 .NET 애플리케이션을 만드는 데에 이 칼럼 내용을 도움되길 바래용~

들어가면서

Visual C++ 팀은 많은 시간을 들여가며, 사용자의 의견을 듣고, .NET과 C++로 작업을 하였으니..그 결과 Visual C++ 2005에서의 CLR에 대한 지원을 재설계하기로 맘먹었어. 이 재설계된 물건을 가리켜, C++/CLI라고 부르니, 이는 CLR 타입을 사용하고 제작하는 데 있어 좀더 자연스러운 구문(syntax)을 제공하는 데 초점을 모은 결과야. 요 칼럼에서는 이 새로운 구문을, CLR에 가장 밀접하게 관계된 언어인 C#과 Managed C++와 비교해볼 것이야. 또한, 적당한 곳에서 네이티브 C++와 유사한 개념에 대해서도 보여줄 것이야...

CLI(Common Language Infrastructure)는 MS .NET 기술을 근간으로한 명세서들을 모아논 것이니, CLR(Common Language Runtime)은 CLI를 구현해 놓은 것이야. C++/CLI 언어의 설계는 이 CLI를 자연스리 C++이 지원하는 데에 목표로 잡았고, Visual C++ 2005 컴파일러는 CLR에 대한 C++/CLI를 구현한 것이야.

여기에는 두 가지 중대한 사항이 있는데, 첫 번째는 Visual C++이 CLR을 타깃으로하는 가장 하위 수준의 언어라는 점(MSIL보다도), 두 번째는 .NET 프로그래밍이 원래의 C++ 프로그래밍 만큼이나 자연스러워져야 한다는 점이지.

이 칼럼은 C++ 프로그래머를 위해 쓰여진 것이니, C#이나 VB.NET에서 C++/CLI로 넘어오라고 말하진 않겠어. 만일 네가 C++를 사랑하고, C#의 생산성을 유지하는 동시에 C++ 고유의 능력 모두를 이용하고 싶다면, 이 칼럼은 그야말로 네게 딱!인 칼럼이야. 뿐만 아니라, 어떻게 해서 Visual C++ 2005를 통해, 좀더 우아하고도 효율적인 .NET 코드를 작성하게 만들 수 있는지에 초점을 맞출 것이야.

객체 생성

CLR은 두 가지 타입, 즉 값 타입과 참조 타입을 정의하지. 값 타입은 할당과 제어의 효율성을 위해서 설계되었지. 이 타입은 C++의 내장 타입처럼 동작하고, 네 자신만의 타입으로도 만들 수있는 것으로서, Bjarne Stroustrup은 이를 concrete 타입이라고 불러. 반면 참조 타입의 설계는 네가 객체 지향 프로그래밍에서 기대하는 모든 특징, 즉 클래스 계층체(hierarchy)와 이에 따라붙는 여러 가지의 것들(파생 클래스, 가상 함수 등)을 제공하는 데 목적을 두었지. 뿐만 아니라 이 참조 타입은 CLR을 통해, 가비지 콜렉션이라 부르는 자동 메모리 관리같은 런타임 기능도 추가로 제공하지. CLR은 이들 두 타입에 대해 세부적인 런타임 타입 정보도 함께 제공하는데, 이 기능을 가리켜 리플렉션(reflection)이라고 불러.

값 타입은 스택에 할당되고, 참조 타입은 managed 힙에 할당되는데, 이 힙은 CLR의 가비지 콜렉터(GC)가 관리해. 네가 C++로 어셈블리(assembly)를 개발한다면, 네이티브 C++ 타입을 CRT 힙에 할당할 수 있어. 마치 네가 언제나 그래왔던 것처럼. 장래에는 말야, Visual C++ 팀이 네이티브 C++ 타입을 이 managed 힙에도 할당할 수 있도록 만들 것이야. 결국, 가비지 콜렉션은 네이티브 C++에서도 똑같이 매력적인 놈이 되는 것이쥐.

네이티브 C++에서는 객체가 생성될 장소를 고를 수 있었지? 어떤 타입도 스택이나 CRT 힙에 할당될 수 있어.

// 스택에 할당된다. 
std::wstring stackObject; 

// CRT 힙에 할당된다. 
std::wstring* heapObject = new std::wstring;

보다시피, 객체 할당될 장소는 타입 각각에 대해서 독립적으로 지정할 수 있고, 이 선택권은 전적으로 프로그래머에게 달려있지. 게다가, 할당 구문 또한 스택과 힙의 경우가 완전히 다르쥐.

하지만, C#에서는 값 타입을 스택에다가 생성하고, 참조 타입은 힙에다가 생성해. 아래에 보면, System.DateTime 타입 작성자가 이 타입을 값 타입으로 선언하였어.

// 스택에 할당된다.
System.DateTime stackObject = new System.DateTime(2003, 1, 18);

// managed 힙에 할당된다.
System.IO.MemoryStream heapObject = new System.IO.MemoryStream();