🏎️
.NET은 마이크로소프트가 만든 개발 플랫폼입니다.
언어 하나를 말하는 게 아니라, 언어 + 컴파일러 + 런타임 + 표준 라이브러리 + 도구를 묶은 생태계 전체를 말해요.
자바로 치면 "Java 언어 + JDK + JVM + Spring + Maven" 을 한 회사가 통째로 만든 느낌입니다.
.NET은 이름 변천이 꽤 복잡합니다.
| 시기 | 이름 | 특징 |
|---|---|---|
| 2002~ | .NET Framework | 윈도우 전용, 기업 레거시 시스템에 아직 많이 남아 있음 |
| 2016~ | .NET Core | 오픈소스, 크로스 플랫폼 (윈도우 · 리눅스 · 맥) |
| 2020~ | .NET 5, 6, 7 ... | Core를 기반으로 이름을 통합. 이후 그냥 ".NET + 버전 숫자" |
그래서 현장에서 ".NET"이라고 하면
둘은 호환이 완전하지 않아서 "어떤 .NET이냐" 를 먼저 확인하는 게 중요해요.
[C# 소스코드]
│ 컴파일 (Roslyn 컴파일러)
▼
[IL (중간 언어)] ── .dll / .exe (어셈블리)
│ 실행 시
▼
[CLR (Common Language Runtime)]
│ JIT 컴파일
▼
[기계어] → CPU에서 실행
| 구성 요소 | 역할 |
|---|---|
| Roslyn | C# 소스를 IL로 컴파일하는 컴파일러 |
| IL (Intermediate Language) | OS · CPU에 독립적인 중간 코드 |
| 어셈블리 (.dll / .exe) | IL과 메타데이터를 담은 배포 단위 |
| CLR | IL을 실행하는 런타임. JIT, GC, 예외 처리, 타입 안전성 담당 |
| BCL (Base Class Library) | 컬렉션, 파일, 네트워크 등 기본 라이브러리 |
| CTS / CLS | 여러 .NET 언어가 서로 호환되도록 하는 공통 타입 규칙 |
어디서 많이 본 구조죠? 맞습니다. 자바와 거의 같은 구조입니다.
| 역할 | Java | .NET |
|---|---|---|
| 대표 언어 | Java (Kotlin, Scala) | C# (F#, VB.NET) |
| 컴파일러 | javac | Roslyn (csc) |
| 중간 코드 | 바이트코드 (.class) | IL |
| 배포 단위 | .jar | 어셈블리 (.dll) |
| 런타임 | JVM | CLR |
| JIT 컴파일러 | HotSpot | RyuJIT |
| 기본 라이브러리 | JDK 클래스 라이브러리 | BCL |
| 빌드 · 패키지 | Maven / Gradle | dotnet CLI · MSBuild / NuGet |
| 웹 프레임워크 | Spring Boot | ASP.NET Core |
| ORM | JPA / Hibernate | Entity Framework Core |
| 네이티브 컴파일 | GraalVM Native Image | Native AOT |
// Java
public class Hello {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4);
List<Integer> evens = nums.stream()
.filter(n -> n % 2 == 0)
.toList();
System.out.println(evens);
}
}
// C#
var nums = new List<int> { 1, 2, 3, 4 };
var evens = nums.Where(n => n % 2 == 0).ToList(); // LINQ
Console.WriteLine(string.Join(", ", evens));
C#은 최상위 문(top-level statements)을 지원해서
class,Main없이 바로 코드를 쓸 수 있습니다.
자바의 Stream API에 해당하는 게 LINQ 예요.
// Java - 타입 소거 (Type Erasure)
List<String> a = new ArrayList<>();
List<Integer> b = new ArrayList<>();
// 런타임에는 둘 다 그냥 ArrayList
// C# - 런타임에도 타입 정보가 살아있음 (Reified Generics)
var a = new List<string>();
var b = new List<int>();
// 런타임에도 List<string>, List<int>로 구분됨
자바는 실행 시점에 제네릭 타입 정보가 지워지고, .NET은 남아 있습니다.
그래서 .NET은 List<int>처럼 기본 타입을 박싱 없이 다룰 수 있어 성능상 유리한 경우가 있어요.
struct로 사용자 정의 값 타입을 만들 수 있음 (힙이 아닌 스택에 할당 가능)int, double 같은 기본형만. 사용자 정의 값 타입은 Project Valhalla 로 개발 중C#은 비동기(async/await), LINQ, 프로퍼티(get; set;) 같은 기능을 비교적 일찍 도입했고,
Java는 하위 호환성을 중시해서 천천히, 대신 신중하게 기능을 추가하는 편입니다. (최근엔 Record, Virtual Thread 등으로 빠르게 따라오는 중)
dotnet CLI 하나로 생성 · 빌드 · 테스트 · 배포까지고객사에 Java 시스템과 .NET 시스템이 섞여 있는 경우가 흔합니다.
특히 공장 쪽 MES나 윈도우 기반 사내 시스템은 .NET인 경우가 많아서,
직접 개발하진 않더라도 "상대 시스템이 .NET이다" 라는 걸 이해하고 있으면 연계 협의가 훨씬 수월해요.
💡 EAI 솔루션의 플랫폼과 연결 대상 시스템의 플랫폼은 상관없습니다.
자바 기반 TIBCO도 .NET 시스템과 DB, HTTP, MQ, 파일 같은 표준 방식으로 얼마든지 연계합니다.
.NET 진영의 대표 EAI는 마이크로소프트의 BizTalk Server 입니다.
다만 지금은 세대교체 중입니다.
| 항목 | 일정 |
|---|---|
| 마지막 버전 | BizTalk Server 2020 |
| 판매 종료 (예정) | 2027년 3월 |
| 메인스트림 지원 종료 | 2028년 4월 |
| 연장 지원 종료 | 2030년 4월 |
| 후속 제품 | Azure Logic Apps (Azure Integration Services) |
국내에서 TIBCO, webMethods 가 대표로 꼽히는 이유도 여기서 보입니다.
둘 다 자바 기반이라 윈도우 · 리눅스 · 유닉스를 가리지 않고, 특정 플랫폼에 묶이지 않아서
유닉스 · 리눅스 서버가 많은 금융 · 대기업 환경과 자바 중심의 국내 SI 생태계에 잘 맞았거든요.
Java와 .NET은 "중간 코드 + 가상 머신(런타임)" 구조입니다. 다른 대표적인 구조들은 이렇습니다.
| 구조 | 대표 언어 | 실행 방식 | 특징 |
|---|---|---|---|
| 중간 코드 + VM | Java, C# | 소스 → 중간 코드 → VM이 JIT로 실행 | 한 번 빌드로 여러 OS, 실행 중 최적화 |
| 네이티브 컴파일 | C, C++, Go, Rust | 소스 → 바로 기계어 | 빠른 시작, VM 없음, OS · CPU별로 따로 빌드 |
| 인터프리터 | Python, Ruby | 소스 → 바이트코드 → 한 줄씩 해석 실행 | 개발이 빠르고 유연, 실행 속도는 상대적으로 느림 |
| JS 엔진 | JavaScript (Node.js) | V8 엔진이 JS를 JIT 컴파일 | 이벤트 루프 기반 비동기, 웹과 서버를 같은 언어로 |
| BEAM VM | Erlang, Elixir | BEAM 가상 머신의 경량 프로세스 | 장애 격리 · 고가용성, 통신 · 메신저 계열에서 강함 |
최근엔 경계도 흐려지는 중이라, Java(GraalVM)와 .NET(Native AOT)도 네이티브 컴파일을 지원합니다.
📎 네이티브 컴파일은 다음 글 (링크 예정) 에서 한번 다뤄볼까 합니다.
.NET = 마이크로소프트판 JVM 생태계.
구조는 자바와 거의 쌍둥이고, 차이는 누가 관리하느냐 · 제네릭 · 값 타입 · 생태계가 강한 영역에 있다.