C# 코드는 어떻게 실행되는가 - 1편, .NET과 C#
언어는 C#, 플랫폼은 .NET
C#은 사람이 작성하는 프로그래밍 언어이다. 문법, 타입 시스템, 객체 지향, 함수 등을 제공하며 C# 컴파일러는 소스 코드를 .NET이 이해하는 중간 언어로 바꾼다. .NET은 프로그램을 만들고 실행하는 플랫폼이다. 런타임(CLR), 기본 라이브러리, SDK와 도구를 아우른다. .NET은 Windows, Linux, macOS를 지원한다.
왜 C#과 .NET이 탄생 했을까?
1990년대 말에는 Windows 개발 기술이 여러 갈래(VB, C++, JAVA, ASP 등)로 나뉘어 있었다. Microsoft는 언어마다 달랐던 실행 모델을 공통 런타임과 타입 체계 아래 묶고, 생산성과 안정성을 높일 새 플랫폼을 설계했다.
C# 코드는 어떻게 CPU까지 갈까?
일반적인 .NET 실행은 ‘소스 → 중간 언어 → 런타임 → 네이티브 코드’의 네 단계를 따른다.
CLR이 함께 맡는 일
메모리 관리 — 가비지 컬렉터가 더 이상 참조 되지 않는 관리형 객체를 회수
타입 안정성 — 메타데이터와 공통 타입 체계를 바탕으로 코드를 검사
예외 · 스레드 · 진단 — 공통 실행 서비스와 디버깅 기반 제공
AOT
.NET은 실행 시점의 JIT뿐 아니라, 배포 전에 네이티브 코드로 만드는 AOT도 지원한다. Unity에서도 플랫폼에 따라 Mono 또는 IL2CPP 같은 서로 다른 백엔드를 만난다.
C#과 JAVA, C++과의 비교
C#은 C계열 문법을 공유하고, Java처럼 관리형 런타임 위에서 동작한다. 그러나 언어와 플랫폼의 경계, 네이티브 접근 방식, 배포 선택지는 서로 다르다.
| 관점 | C# / .NET | Java / JVM | C++ |
| 기본 실행 모델 | CIL → CLR의 JIT | 바이트코드 → JVM | 소스 → 네이티브 기계어 |
| 메모리 관리 | 가비지 컬렉션 중심 | 가비지 컬렉션 중심 | 수명과 소유권을 직접 제어 |
| 플랫폼 추상화 | CLR과 공통 라이브러리 | JVM과 Java 표준 라이브러리 | 플랫폼별 빌드 결과와 ABI 영향 |
마무리
이번 포스팅은 C#과 .NET에 대한 기초적인 지식에 대하여 알아 보았다. 아래는 이번 포스팅에서의 핵심 네 가지 문장이다.
01
C#은 언어이고 .NET은 플랫폼이다.
둘은 강하게 결합되어 있지만 동일한 개념은 아니다.
02
C#은 보통 CIL로 컴파일된다.
CLR이 이를 JIT 또는 AOT 방식으로 네이티브 코드와 연결한다.
03
C#은 Java와 관리형 실행 모델을 공유한다.
C++과는 저수준 제어와 자원 관리 철학에서 큰 차이가 난다.
04
어느 언어가 절대적으로 우월한 것은 아니다.
런타임의 편의, 제어 수준, 생태계, 배포 환경에 따라 선택이 달라진다.
더 읽을 자료