개요
C#은 마이크로소프트에서 개발한 객체 지향 프로그래밍 언어다. C#은 강건하고 유지보수를 위한 여러 가지 기능을 제공하는데 메모리를 자동으로 정리해주는 가비지 컬렉션, 함수형 프로그래밍을 위한 람다 식, 비동기 프로그래밍 등이 있다.
.NET 아키텍처
C#과 함께 빼놓을 수 없는 것이 .NET이다. 마이크로소프트는 어떤 플랫폼이던지 언어를 동작시킬 수 있도록 공용 언어 인프라(CLI; Common Language Infrastructure)라는 사양을 발표했는데, .NET은 이 사양에 맞춰 마이크로소프트가 구현한 프로그램인 공용 언어 런타임(CLR; Common Language Runtime)과 클래스 라이브러리 세트를 말한다. C#은 이러한 .NET 위에서 동작하는 프로그래밍 언어 중에 하나다.*
*그 외에 F#, Visual Basic이 있다.
빌드
C#은 컴파일을 하면 CLI 사양을 준수하는 중간 언어(Intermediate Language)*로 컴파일 된다. 그리고 이러한 IL 코드와 프로그램에 사용되는 리소스**가 함께 패키징 되어 어셈블리(Assembly)가 된다.*** 어셈블리는 서로 함께 사용되어 논리적 기능 단위를 형성하도록 빌드되는 타입 및 리소스의 컬렉션을 의미한다. 어셈블리는 실행 파일(.exe) 또는 동적 연결 라이브러리(.dll)의 형태를 가지며, .NET 기반 애플리케이션에 대한 배포, 버전 제어, 재사용, 활성화 범위 및 보안 권한의 기본 단위를 형성한다.
* 자바를 알고 있다면, 자바의 바이트 코드(Byte Code)를 생각하면 된다.
** 아이콘, 마우스 커서, 메뉴 등이다.
*** C/C++를 컴파일하면 생성되는 어셈블리 언어와는 다른 개념이다. 혼동하지 않도록 주의하자.
C# 프로그램을 실행하면 어셈블리가 CLR에 로드 되는데, CLR은 IL 코드를 플랫폼에 따라 JIT(Just-In-Time) 컴파일* 혹은 AOT(Ahead-Of-Time) 컴파일**을 수행하여 네이티브 명령어로 변환한다.
*프로그램 실행 중에 그때그때 컴파일을 하는 것이다.
**프로그램 실행 전 미리 컴파일을 진행하는 것이다.