.NET Platform
1. 목표 및 개요
1.1 닷넷(.NET)이 낯설어도 꼭 배워야 하는 이유
C#을 처음 시작하면 설명 속에서 갑자기 .NET(닷넷)이라는 단어가 튀어나와 “이건 또 뭐지?” 하고 멈추게 되는 거죠.
그럴 때 우리는 보통 책이나 강의에서 정의를 찾아봅니다. 그리고 대부분 이런 문장을 만나게 됩니다.
“C#은 프로그래밍 언어이고 .NET은 플랫폼(실행 환경)이다.”
하지만 입문자 입장에서 '플랫폼'이라는 용어가 너무 추상적입니다.
그래서 오히려 “그래서 .NET이 정확히 뭔데?”라는 의문이 더 커지곤 합니다.
그래서 이렇게 이해하면 훨씬 쉽습니다.

C#은 혼자서 실행되는 언어가 아닙니다.
C#은 .NET 플랫폼 위에서 실행되도록 설계된 언어입니다.
즉, 우리가 C#으로 뭔가를 만든다는 건 “C#만”으로 끝나는 게 아니라, 그 뒤에서 .NET이 함께 움직인다는 뜻입니다.
C#으로 프로그램을 만들 때 .NET은 단계별로 이렇게 연결됩니다.
- 코드 작성(개발 단계): C# 코드는 .NET이 제공하는 라이브러리/프레임워크를 활용해 구현합니다.
- 빌드(컴파일 단계): C# 소스 코드를 빌드할 때 .NET이 제공하는 SDK(컴파일러)를 사용해 DLL/EXE 결과물을 만듭니다.
- 실행(런타임 단계): 만들어진 프로그램을 실행하려면 .NET의 런타임(CLR) 같은 실행 환경이 필요합니다.
정리하면, C# 코드는 혼자서 바로 프로그램이 되는 것이 아니라, .NET이 함께 있어야 비로소 실행되고 동작합니다.
이번 섹션에서는 “그럼 왜 이런 실행 환경(.NET)이 필요했을까?”라는 질문에서 출발해,
C#과 .NET이 어떤 관계로 연결되는지를 한 번에 정리해 보겠습니다.
💡 왜 이 개념이 중요한가요?
C#과 닷넷(.NET)을 구분하는 일은 단순한 용어 암기가 아니라, 개발자로서의 성장 단계 전체에 영향을 줍니다.
- 취업 전 (면접 대비):
"C#과 .NET의 관계를 설명해보세요", "Managed Code가 무엇인가요?" 같은 질문은 기초 개념이 정리되어 있는지를 빠르게 확인하는 대표 질문입니다. - 취업 후 (성장 기반):
실무에서 마주치는 가비지 컬렉션(GC), 성능 최적화, 비동기 처리 같은 주제는 결국 "내 코드가 .NET 실행 환경에서 어떻게 동작하는가"를 이해하는 데서 시작합니다.
1.2 학습 목표
이 섹션을 끝까지 학습하면, 다음 내용을 스스로 설명할 수 있게 되는 것이 목표입니다.
✅ C#과 .NET의 관계를 명확히 구분한다
"C#은 레시피(언어)이고, .NET은 주방(실행 환경)이다"라는 비유를 통해 둘의 역할을 명확히 설명할 수 있습니다.
✅ .NET의 등장 배경과 OS 종속성 문제를 이해한다
과거 개발자들을 괴롭혔던 OS 종속성 문제가 무엇인지, 그리고 가상 머신(VM) 기술이 이를 어떻게 해결했는지 파악합니다.
✅ 프로그램의 실행 흐름(CIL/CLR)을 파악한다
소스 코드가 바로 실행되는 것이 아니라, 중간 언어(CIL) ➔ 런타임(CLR) ➔ 기계어(JIT)로 변환되는 과정을 이해합니다.
1.3 학습 로드맵
닷넷을 가장 빠르게 이해하기 위해, 기술의 등장 배경과 원인을 거슬러 올라가는 역추적 방식으로 학습을 진행합니다.
Q1. (현상) 닷넷은 왜 등장했나요?
A1. "Java의 플랫폼 독립 실행이라는 새로운 패러다임에 대응하기 위해"
1990년대 후반, 웹/서버 시장에서 Java가 ‘새로운 개발 패러다임’을 내세우며 빠르게 영향력을 넓혔습니다.
Microsoft는 이에 대응하기 위한 전략과 브랜드로 .NET을 전면에 내세웠고, 그 흐름은 C# 같은 닷넷 언어로 이어졌습니다.
Q2. (원인) 그 '플랫폼 독립 실행이라는 새로운 패러다임’은 무엇인가요?
A2. "OS에 묶이지 않는 가상 머신(VM) 기술"
핵심은 OS에 직접 묶이지 않는 가상 머신 기반 실행 환경입니다.
여기에 더해, 개발에 필요한 라이브러리·도구·배포/버전 규칙까지 한 덩어리로 제공하는 플랫폼 중심의 개발 방식을 제시했습니다.
Q3. (근본) 해결하려던 진짜 문제는?
A3. "지긋지긋한 OS 플랫폼 종속성"
모든 이야기의 시작점은 OS 플랫폼 종속성 문제(운영체제마다 코드를 다시 짜야 했던 개발자들의 고통) 입니다.
따라서 이 글은 가장 근본적인 [STEP 3] OS 플랫폼 종속성 문제에서 시작합니다. 그리고 마지막에는 [STEP 1] 닷넷이 완성된 모습에서 닷넷이 단순한 도구가 아니라 거대한 개발 생태계(Ecosystem) 라는 점을 이해합니다.
2. 운영체제 종속성 문제
운영체제 플랫폼 종속성이라는 어려운 단어는 우리가 소프트웨어를 설치할 때 마주치는 흔한 장면만으로 설명됩니다.
2.1 "왜 설치 파일이 다 따로 있을까?"
웹 브라우저인 Chrome이나 개발 도구인 VS Code를 다운로드하려 할 때,


같은 프로그램인데도 불구하고 설치 파일이 제각각입니다.
- Windows: .exe, .msi 파일 필요
- macOS: .dmg, .pkg, .zip 파일 필요
- Linux: .deb, .rpm 파일 필요
이것이 바로 OS 종속성입니다. 윈도우용으로 만든 프로그램(.exe)을 맥(Mac)에 가져가면 실행되지 않습니다.
마치 한국어만 할 줄 아는 사람에게 프랑스어로 말을 걸면 알아듣지 못하는 것과 같습니다.
2.2 운영체제 종속성이 발생하는 이유
운영체제 종속성은 프로그램은 OS의 규칙(실행 파일 형식, 시스템 호출, 라이브러리, 권한/파일 시스템, 설치/배포 방식 등)에 맞춰 만들어지기 때문에 생깁니다.

2.3 개발자의 현실: "변경된 요구사항은 하나인데, 수정할 프로젝트는 세 개?"
이 'OS 종속성' 때문에 과거의 개발자들은 엄청난 고통을 겪었습니다. "C/C++은 모든 OS에서 컴파일되니까 이식성이 좋은 거 아닌가요?"라고 반문할 수 있습니다. 이론은 그렇지만, 현실은 전혀 다릅니다.

😫 개발자의 비명
"똑같은 기능을 추가하여 프로그램을 수정하는데, 윈도우용으로 C++ 짜고, 맥용으로 Objective-C 짜고, 리눅스용으로 또 다시 짜야 한다고? 비용과 시간이 3배가 들잖아!"
4. 운영체제 독립 실행이라는 새로운 패러다임
개발자들의 비명을 잠재우기 위해 등장한 해결책, 그것은 바로 "중간에 통역사를 두자!"는 아이디어였습니다.
이것이 바로 Java의 JVM과 닷넷의 CLR로 대표되는 가상 머신(Virtual Machine) 패러다임입니다.
4.1 기존 방식 vs 새로운 방식
가장 큰 차이는 "누가 최종적으로 번역(실행)하는가"에 있습니다.

| 구분 | 기존 방식 (C/C++) | 새로운 방식 (Java, .NET) |
| 대화 상대 | 운영체제 (OS)와 직접 대화 | 가상 머신 (VM)과 대화 |
| 번역 시점 | 개발할 때 (컴파일 타임) | 실행할 때 (런타임) |
| 결과물 | 특정 OS 전용 기계어 (.exe) | 중간 언어 (Bytecode / CIL) |
4.2 핵심 기술 : JVM과 CLR의 구조
이 새로운 패러다임의 핵심은 "가상 머신(Virtual Machine)"이라는 소프트웨어입니다. Java에서는 JVM, 닷넷에서는 CLR이라고 부릅니다.

- 중간 언어 (Intermediate Language): 특정 OS에 종속되지 않은 '공통 번역 대본'입니다. (Java는 Bytecode, 닷넷은 CIL이라고 부릅니다.)
- 가상 머신 (Virtual Machine): 각 운영체제에 설치되어, 중간 언어를 읽고 실행하는 순간에 해당 OS가 이해하는 기계어로 실시간 번역(JIT 컴파일)해 주는 '통역사'입니다. (Java는 JVM, 닷넷은 CLR입니다.)
결국 개발자는 OS를 신경 쓰지 않고 '중간 언어'까지만 만들어 배포하면, 나머지는 각 사용자의 컴퓨터에 설치된 '가상 머신'이 알아서 처리하는 혁신적인 구조입니다.
5. 닷넷의 등장 배경과 목표
1990년대 후반, Java가 "한 번 작성하면 어디서든 실행된다(Write Once, Run Anywhere)"는 슬로건을 내세우며, 특정 운영체제(OS)에 종속되지 않는 새로운 개발 환경 패러다임을 제시하며 소프트웨어 업계는 큰 변화를 맞이합니다.
당시 Windows 중심의 생태계를 구축하고 있던 마이크로소프트는 이에 큰 위기감을 느꼈고, 2002년 2월 .NET Framework 1.0을 공식 출시하며 본격적인 개발 플랫폼 경쟁에 뛰어듭니다.
🕵️♂️ [Deep Dive] 전쟁의 본질은 '주도권' 싸움
기술적인 목표 이면에는 마이크로소프트의 생존 전략이 숨어 있었습니다.
당시 Java가 "OS에 상관없는 세상"을 외치며 마이크로소프트의 핵심 자산인 Windows의 영향력을 위협했기 때문입니다.
- Java의 공격: "윈도우 버려도 돼. Java만 깔려 있으면 어디서든 돌아가."
- .NET의 반격: "우리가 Java보다 훨씬 편하고(생산성), 강력한(C++) '만능 키(.NET)'를 줄게. 그러니 계속 우리 생태계에 머물러 있어."
결국 닷넷은 단순한 기술 도구를 넘어, 소프트웨어 개발 패러다임의 주도권을 가져오기 위한 마이크로소프트의 승부수였던 것입니다.
5.2 개념적 비유 (요리와 주방)
닷넷을 가장 쉽게 이해하기 위해 '음식'에 비유해 보겠습니다. 닷넷은 음식을 완성하기 위한 거대한 주방 시스템입니다.
- C# (수단) = 레시피: 요리를 만드는 조리법
- .NET (기반) = 주방 시스템: 가스, 수도, 조리 도구 등 요리가 실행되는 환경
- 프로그램 (결과물) = 완성된 요리
5.3 기술적 구성 요소
위의 주방 비유를 실제 닷넷의 기술 용어로 바꾸면 다음과 같습니다.
.NET Platform Structure/
├─ Languages (C#, F#, VB.NET) # 개발자가 작성하는 도구 (레시피)
├─ Libraries (BCL, Runtime Libs) # 미리 만들어진 기능 모음 (손질된 식재료)
└─ Runtime (CLR) # 프로그램을 실제 실행하는 엔진 (조리 기구)
이러한 구조 덕분에 개발자는 운영체제의 복잡함을 신경 쓰지 않고, 닷넷이라는 '공통 플랫폼' 위에서 개발에만 집중할 수 있습니다.
6. 플랫폼(Platform)의 개념
닷넷을 흔히 '개발 플랫폼'이라고 부릅니다. 이 개념을 명확히 하기 위해 우리 주변의 '플랫폼' 예시를 살펴보겠습니다.
6.1 효율의 극대화 : 전기차(EV) 플랫폼

전기차 시장에서 플랫폼은 차의 뼈대가 되는 기본 골격(Chassis)을 의미합니다.
- 제조사는 이 플랫폼 하나를 공유하여 세단, SUV 등 다양한 모델을 만듭니다.
- 핵심: 매번 바퀴부터 새로 만들 필요가 없어 개발 시간과 비용이 획기적으로 절감됩니다.
6.2 연결과 확장 : 승강장(Station) 플랫폼

기차역 승강장(Platform)은 사람들이 모이고 흩어지는 공간입니다.
- 사람이 모이는 곳에 편의점, 광고판 등 새로운 비즈니스가 생겨납니다.
- 핵심: 기반 시설을 통해 새로운 가치와 서비스가 창출되는 공간입니다.
6.3 IT 플랫폼과 개발 환경 플랫폼으로서의 닷넷

닷넷은 위 두 가지 속성을 모두 가집니다. 개발자에게 공통 골격(전기차)을 제공하여 개발 효율을 높이고, 닷넷 생태계 안에서 웹, 모바일, 게임 등 다양한 서비스(승강장)로 확장할 수 있게 합니다.
7. .NET(닷넷) 플랫폼의 정체
7.1 닷넷은 거대한 생태계다
닷넷을 단순히 '언어'나 '툴' 하나로 정의하기 힘든 이유는 그 범위가 매우 넓기 때문입니다. 아래 그림을 볼까요?

7.2 그림으로 보는 닷넷의 구성요소
위 그림(.NET Platforms)에 있는 각 원(Bubble)들은 닷넷이 제공하는 다양한 '무기'들을 의미합니다.
- WinForms / WPF: 전통적인 윈도우 데스크톱 프로그램 개발 도구
- ASP.NET: 웹 사이트 및 서버 개발 도구
- Xamarin / .NET MAUI: 하나의 코드로 안드로이드, iOS, PC 앱을 동시에 만드는 크로스 플랫폼 기술
- .NET Core / Framework: 이 모든 것을 돌아가게 하는 엔진(Runtime)
과거에는 윈도우, 리눅스, 맥용 프로그램을 각각 따로 만들어야 해서 비용 낭비가 심했습니다. 닷넷은 "소프트웨어를 딱 하나만 만들면, 플랫폼 상관없이 어디서든 실행되게 하자"는 목표로 만들어졌습니다. 즉, 닷넷은 개발자가 무엇을 만들고 싶든(웹, 앱, 게임, 클라우드 등) 필요한 모든 도구를 제공하는 '종합 선물 세트(플랫폼)'인 것입니다.
7.3 닷넷을 바라보는 세 가지 관점
닷넷은 보는 관점에 따라 다르게 정의될 수 있는 거대한 기술 집합입니다.
- 개발 서비스 관점: 다양한 앱을 만들 수 있는 "개발환경 플랫폼"
- 구현 기술 관점: WinForm, WPF 등을 제공하는 "프레임워크"
- 실행 기술 관점: OS 독립적인 실행을 보장하는 "가상 머신(VM)"
7.4 닷넷의 5대 구성요소
닷넷 플랫폼이 원활하게 돌아가기 위해 다음 5가지 요소가 유기적으로 작동합니다.
- 런타임 (Runtime): 애플리케이션 코드를 실제 실행하는 환경 (CLR)
- 컴파일러 (Compiler): C# 소스 코드를 실행 가능한 중간 언어로 변환
- 라이브러리 (Library): 파일 입출력, 네트워크 등 미리 만들어진 유틸리티 기능 제공
- 앱 스택 (App Stack): ASP.NET Core(웹), MAUI(모바일) 등 특정 앱을 개발하기 위한 도구 모음
- SDK 및 도구: 빌드, 테스트, 배포를 돕는 개발 키트 (CLI, Visual Studio 등)
7.5 진정한 크로스 플랫폼으로의 진화

최신 .NET은 윈도우를 넘어 Linux, macOS, iOS, Android까지 아우릅니다.
- MAUI (.NET 6+): 하나의 코드로 모바일과 데스크톱 앱 동시 개발
- Native AOT (.NET 7+): 닷넷 코드를 타겟 OS의 네이티브 코드(기계어)로 직접 컴파일하여, 가상 머신 없이도 실행 가능하게 만드는 고성능 기술 지원
궁극적으로 닷넷은 "하나의 언어와 최소한의 프로젝트로, 모든 OS에서 실행 가능한 소프트웨어"를 만드는 것을 목표로 완성되어 가고 있습니다.
8. 동작 원리 (개발부터 실행까지)
닷넷 환경에서 프로그램이 만들어지고 실행되는 과정은 기존 언어(C/C++)와는 사뭇 다릅니다. 이 과정을 단계별로 살펴보겠습니다.
8.1 데이터 파일 실행 개념
여기서 헷갈리지 말고, 꼭 이해해야 할 점이 있습니다. 바로 '프로그램(실행 파일)'과 '문서(데이터 파일)'의 차이입니다.

- 데이터 파일 (.docx, .pptx): 형식이 표준화되어 있어, 윈도우든 맥이든 '뷰어 프로그램'만 있으면 열어볼 수 있습니다.
- 실행 파일 (Chrome, Word 프로그램 자체): 운영체제와 직접 대화해야 하므로, 반드시 그 OS의 언어(기계어)로 만들어져야 합니다.
8.2 빌드 및 실행 구조의 비밀
C# 소스 코드를 빌드하면 .exe나 .dll 파일이 생성되지만, 이는 기계가 바로 이해할 수 있는 기계어(Native Code)가 아닙니다. 아래 그림을 통해 기존 C++ 방식과의 차이를 명확히 알 수 있습니다.

- CIL (Common Intermediate Language): C# 컴파일의 결과물은 '공통 중간 언어'입니다. 아직 특정 OS에 종속되지 않은 상태입니다. (위 그림의 보라색 박스 영역)
- CLR 가상 머신 실행: 일반적인 프로그램은 OS에서 바로 실행되지만, 닷넷 프로그램은 반드시 CLR(가상 머신)을 거쳐야 실행됩니다. CLR이 이 CIL 코드를 읽어 현재 OS에 맞는 기계어로 실시간 번역(JIT)합니다.
8.3 닷넷 실행 환경 개념 : "문서처럼 호환되게"

"왜 프로그램은 OS를 가리는데, 문서 파일은 아무데서나 열릴까요?" 이 차이를 이해하는 것이 닷넷의 '중간 언어' 개념을 이해하는 열쇠입니다. 닷넷은 마치 워드 문서처럼, 소스 코드를 '어느 OS에서나 열리는 공통 파일(중간 언어)'로 만드는 것을 목표로 합니다.
9. 결론 : 통합된 미래 (One .NET)
오늘날의 최신 .NET은 과거 "윈도우 전용"이라는 꼬리표를 완전히 떼어냈습니다. 이제 닷넷은 명실상부한 초거대 통합 플랫폼입니다.
9.1 닷넷으로 할 수 있는 것들
C# 하나만 알면, 다음과 같은 모든 분야의 소프트웨어를 만들 수 있습니다.
- 🌐 Web: ASP.NET Core (세계 최고 수준의 고성능 백엔드 서버)
- 📱 Mobile: .NET MAUI (iOS, Android 앱을 한 번에 개발)
- 💻 Desktop: WPF / WinForms (Windows 전용), MAUI (Win/Mac 크로스 플랫폼)
- 🎮 Game: Unity (전 세계 모바일 게임의 절반 이상이 C#으로 제작)
- ☁️ Cloud & AI: Azure / ML.NET (클라우드 네이티브 및 인공지능 개발)
9.2 닷넷과 C#의 관계
C#은 닷넷 플랫폼을 지원하는 여러 언어(VB.NET, F# 등) 중 하나일 뿐입니다. 하지만 닷넷 생태계를 지탱하는 가장 핵심적인 언어입니다.

C#은 닷넷을 위해 탄생했고, 닷넷의 새로운 기능을 가장 먼저, 가장 완벽하게 지원하는 '적장자(嫡長子)' 언어이기에 닷넷 생태계에서 가장 중요합니다.
9.3 마치며 : 닷넷이 주는 가치
"결국 닷넷을 배운다는 것은,
하나의 언어(C#)로 세상의 거의 모든 플랫폼을 아우르는
독보적인 기술 경쟁력(Competitive Edge)을 확보하는 것과 같습니다."
이제 닷넷의 탄생 배경과 원리를 이해했으니, '플랫폼에 얽매이지 않는 개발자'로서의 첫걸음을 자신 있게 내딛으시길 바랍니다.
10. Visual Studio로 알아보는 닷넷의 플랫폼 호환성
닷넷은 다양한 프로그래밍 언어를 활용해 개발할 수 있습니다.

Linux, macOS, Windows, iOS, Android 등 다양한 운영체제에서 동작합니다.

콘솔, 데스크톱, 웹 및 모바일 애플리케이션을 만들 수 있는 통합 개발 환경을 제공합니다.

Visual Studio 크로스 플랫폼 지원 기능
- .NET 6+: 크로스 플랫폼 UI인 MAUI 지원
- .NET 7+: Native AOT 기능 제공 (타겟 플랫폼의 네이티브 코드로 직접 컴파일)

🔗 닷넷으로 개발 가능한 애플리케이션
아래 모든 어플리케이션이 닷넷 기술을 기반으로 만들어집니다.
