포스트

.NET에 대해서

.NET에 대해서

.NET은 Microsoft에서 개발한 소프트웨어 개발 프레임워크 및 런타임 환경으로, 다양한 플랫폼에서 애플리케이션을 개발하고 실행할 수 있도록 설계되었다.

.NET 5 (이후 버전) 부터는 기존 .NET Core 라인과 .NET Framework 일부 기술들을 통합 ∙ 재설계해, 단일 .NET 브랜드로 발전해왔다.

.NET Framework

Microsoft에서 Windows 전용으로 개발된 애플리케이션을 실행하기 위한 프레임워크 (프레임워크 + 런타임 환경 = 플랫폼) 로, 2002년 1.0 버전으로 처음 출시되었다. 주로 데스크톱 애플리케이션(WPF, WinForms), 웹 애플리케이션 (ASP.NET), 엔터프라이즈 솔루션 개발에 사용되었다. 2019년 4.8 버전 출시 이후 .NET Core과의 통합으로 개발을 새로 시작한다면 .NET Framework 대신 .NET의 사용이 권장되고 있다.

다음은 .NET Framework의 주요 특징이다.

  1. Window 전용
    • Windows OS에서만 실행 가능하며, 크로스 플랫폼은 지원하지 않는다.
    • Windows Form(WPF, WinForms), ASP.NET WebForms 같은 Windows 전용 기술을 지원한다.
  2. CLR (Common Language Runtime) 기반
    • .NET Framework의 핵심 런타임 환경
    • C#, VB.NET, F# 등의 코드를 컴파일하여 MSIL (중간 언어)로 변환한 후 실행
    • Garbage Collection(GC)로 자동 메모리 관리 수행
  3. BCL (Base Class Library) 제공
    • 네트워크, 파일 시스템, DB 연결, 암호화 등 다양한 기능을 제공하는 기본 클래스 라이브러리 (BCL, Base Class Library)를 포함.
  4. 웹 개발 지원
    • ASP.NET WebForms와 ASP.NET MVC를 지원해 웹 애플리케이션 개발 가능

.NET Core

Microsoft에서 2016년에 출시한 크로스 플랫폼 오픈소스 .NET 프레임워크. 기존 .NET Framework의 한계를 극복하기 위해 개발됨. 2019년 12월 출시된 .NET Core 3.1 (LTS) 버전 이후부터는 .NET 5 라는 버전명과 함께 통합되었다.

.NET Core의 주요 특징

  1. 크로스 플랫폼 지원
    • Windows 뿐만 아니라 Linux, maxOS에서도 실행 가능.
  2. 오픈 소스
    • Github에서 MIT 라이선스로 공개됨
    • https://github.com/dotnet/runtime
  3. 성능 최적화
    • .NET Framework보다 빠른 JIT(Just-In-Time) 컴파일러 및 Garbage Collector(GC)를 사용.
    • 특히 ASP.NET Core는 기존 ASP.NET 보다 상당 수 빠른 성능을 제공한다.
  4. 모듈형 아키텍처
    • .NET Framework와는 달리 필요한 라이브러리만 선택적으로 추가 가능
  5. 클라우드 & 컨테이너 친화적
    • Docker 및 Kubernetes와의 호환성이 뛰어나며, 마이크로 서비스 아키텍처 개발에 적합
    • Azure, AWS, GCP 등 클라우드 환경에서 최적화된 성능 제공

Xamarin

iOS, Android, Windows에서 동작하는 모바일 애플리케이션을 개발할 수 있도록 도와주는 .NET 기반의 모바일 개발 프레임워크. Mono 프로젝트에서 시작되었으나, 2016년 Microsoft가 인수하며 .NET 생태계에 포함됨. 2024년 5월을 기점으로 Xamarin의 지원은 종료되며, 대신 .NET에 통합된 .NET MAUI가 이를 대신함.

Xamarin.Forms 는 2024년 5월 이후로 지원 종료(EOL)

Xamarin.Android, Xamarin.iOS(네이티브) 쪽도 점차 MAUI와 통합되는 추세

.NET Standard

.NET 기반 애플리케이션(.NET Framework, .NET Core, Xamarin 등)에서 공통적으로 사용할 수 있는 표준 API 집합. 과거에는 .NET Framework, .NET Core, Xamarin이 서로 다른 API를 제공했기 때문에, 각각의 플랫폼에서 같은 기능의 구현을 위해 별도로 작성해야 하는 문제가 있었다. 이러한 문제를 막기위해 모든 .NET 플랫폼이 공통적으로 지원하는 API 표준을 정의했고 이것이 바로 .NET Standard.

.NET 5 부터 .NET 자체가 크로스 플랫폼을 지원하고 모든 기능을 포함하기 때문에 .NET Standard가 필요 없어졌다. .NET Framework 4.x.NET Core 2.x 이전의 레거시 프로젝트와 호환해야 할 상황이라면 여전히 쓰이기도 한다.

📌 .NET의 특징

  • 멀티 플랫폼 지원 : Windows, Linux, macOS, Android, iOS 등에서 실행 가능
  • 다양한 프로그래밍 언어 지원 : C#, F#, VB.NET 등등
  • JIT(Just-In-Time) 및 AOT(Ahead-Of-Time) 컴파일 지원
  • Garbage Collection(GC)기반 메모리 관리
  • 강력한 표준 라이브러리 (.NET Standard 및 .NET Core 기반)
  • 높은 확장성 (클라우드, 웹, 데스크톱, 모바일, 게임 등 다양한 개발 가능)

📌 .NET의 주요 구성 요소

.NET Runtime

.NET 애플리케이션이 실행되기 위한 핵심 런타임 환경으로, 대표적으로 다음과 같은 런타임이 있다.

런타임설명
.NET Framework CLR.NET Framework의 기본 런타임
MonoUnity 및 크로스플랫폼에서 사용되는 런타임
CoreCLR.NET Core 및 .NET 5+에서 주로 사용되는 런타임
IL2CPPCIL을 C++로 변환하는 AOT 컴파일러 (Unity에서 사용)

CIL (Common IntermediateLanguage)

.NET이 실행하는 플랫폼 독립적인 중간언어. C# 코드를 컴파일 한 결과로 CIL 코드가 포함된 .exe 또는 .dll 파일이 생성된다.

  • .NET 언어(C#, F#, VB 등)로 작성된 코드 → CIL(중간 언어)로 변환됨
  • 이후 JIT 또는 AOT 컴파일을 통해 실행됨

유니티에서는 Mono 또는 IL2CPP를 사용하여 CIL을 실행하거나 네이티브 코드로 변환한다.

📌 .NET의 주요 개념

CLR (Common Language Runtime)

CLR은 .NET 애플리케이션을 실행하는 핵심 런타임으로 .NET에서 동작하는 모든 프로그램은 CLR 위에서 실행되며, 다음과 같은 기능을 제공한다.

  • JIT(AOT) 컴파일러: CIL을 기계어 (네이티브 코드) 로 변환하여 실행
  • GC(Garbage Collection): 자동 메모리 관리 수행
  • 예외 처리(Exception Handling) 지원
  • 보안(Security) 및 스레드 관리(Thread Management) 제공

↔️ JIT vs AOT

📌 JIT(Just-In-Time) 컴파일러란?

  • IL을 실행 시점에 실시간(런타임)으로 네이티브 코드로 변환하는 컴파일러.
  • CLR이 실행할 때 코드의 일부만 변환하여 최적화 가능.
  • .NET 5부터는 더 빠른 RyuJIT이 기본 JIT로 사용됨.

📌 AOT (Ahead-Of-Time) 컴파일러란?

  • 실행 시점에서 JIT 컴파일이 필요하지 않음.
  • 초기 실행 속도가 빠름 (JIT를 기다릴 필요 없음).
  • 메모리 사용량이 최적화됨 (JIT를 위해 추가적인 코드 캐싱이 필요 없음).
  • JIT이 지원되지 않는 환경에서 필수 (예: iOS, Unity IL2CPP).
    • Unity는 기본적으로 Mono (JIT & AOT 혼합 모델) 를 사용하지만, iOS 및 콘솔 플랫폼에서는 JIT 없이 AOT 실행해야 한다.
    • 이를 위해 Unity는 IL2CPP (Intermediate Language to C++) AOT 방식을 사용한다.
    • IL2CPP 의 장점
      • JIT 없이 빠른 실행 가능 (특히 모바일 및 콘솔 환경에서 필수)
      • 메모리 관리 및 최적화가 더욱 강력함.
컴파일 방식설명
JIT (Just-In-Time) 컴파일실행 시점에서 CIL을 네이티브 코드로 변환하여 실행
AOT (Ahead-Of-Time) 컴파일실행 전에 네이티브 코드로 변환하여 실행 (IL2CPP 방식)
구분JIT (Just-In-Time)AOT (Ahead-Of-Time)
컴파일 시점실행 시점에 IL → 네이티브 변환배포 전에 IL → 네이티브 변환
실행 속도처음 실행 시 약간 느림 (JIT 필요)실행 속도가 빠름 (미리 컴파일됨)
메모리 사용량런타임에서 코드 최적화 가능 (캐싱 필요)메모리 사용량이 적음
유연성동적 코드 실행 가능 (Reflection, Dynamic Code)동적 코드 실행 불가능
사용 사례일반적인 .NET 애플리케이션 (Windows/Linux)iOS, WebAssembly, Unity, .NET Native AOT

.NET 메모리 관리

Stack과 Heap

  • Stack: 지역 변수 및 값 형식(struct) 저장, 함수 호출 시 자동 해제
  • Heap: 동적으로 할당된 객체(class) 저장, GC가 관리

Garbage Collection (GC)

  • .NET은 Mark-and-Sweep 방식의 GC를 사용하여 불필요한 메모리를 자동 해제.
    • Mark 단계에서 살아있는 객체를 탐색하고, Sweep 단계에서 사용되지 않는 객체를 정리하는 방식으로 동작하는 GC 핵심 알고리즘.
  • GC는 세대(Generation)별로 관리하여 성능 최적화.

GC Generation 구조

GC 세대특징
Gen 0새로 생성된 객체, 가장 빈번하게 GC 실행
Gen 1중간 단계, 자주 사용되는 객체 유지
Gen 2장기적으로 유지되는 객체 (싱글톤, 정적 데이터)

유니티에서는 GC 부담을 줄이기 위해 struct, object pooling 등을 활용하는 것이 중요하다.

.NET의 멀티스레딩 및 병렬 처리

기본적인 멀티스레딩을 제공하는 Thread, 비동기 프로그래밍을 쉽게하는 Taskasync/await 그리고 멀티 코어 환경에서 병렬 처리를 최적화하는 Parallel 라이브러리

유니티는 기본적으로 싱글 스레드 환경이지만, C#의 Thread, Task, async/await과 같은 기능을 활용하면 비동기 작업을 효율적으로 처리할 수 있다.

유니티의 Unity.Jobs, DOTS(ECS), Compute Shader와 같은 시스템을 활용하면 멀티 스레드 성능을 극대화할 수 있다.

C# 컴파일러의 종류

  1. csc (C# Compiler) (csc.exe)
    • .NET SDK에 포함된 기본 C# 컴파일러
    • C# 코드를 .exe 또는 .dll 파일로 변환 가능
  2. Roslyn
    • Microsoft 가 개발한 C# 및 VB.NET 컴파일러 플랫폼
    • 기존 csc.exe 대신 C# 코드 분석, 최적화, 동적 코드 생성 등의 기능을 추가한 컴파일러.
    • 오픈소스로 제공됨.
    • 실시간 코드 분석 및 자동 완성 기능 제공
    • C# 코드의 구문 트리 분석 가능
    • 동적 컴파일 지원 (System.Reflection.Emit, Roslyn Scripting API 사용 가능).
  3. dotnet CLI (dotnet build)
    • .NET Core/.NET의 기본 명령줄 도구에서 제공하는 C# 컴파일 기능.
    • csc.exe를 직접 사용하지 않고, .NET 프로젝트 단위로 빌드 가능.
  4. Mono C# 컴파일러 (mcs)
    • Linux, macOS에서 Mono 런타임을 사용할 때 쓰이는 C# 컴파일러.
    • .NET Framework 환경이 아닌 Mono 환경에서 C# 코드를 실행할 때 사용됨.
    • Xamarin, Unity에서 Mono 기반의 C# 컴파일러를 사용하기도 함.

✅ C# 컴파일러 비교

컴파일러설명사용처
csc.exe기본 C# 컴파일러.NET Framework / .NET
Roslyn최신 C# 컴파일러 플랫폼Visual Studio, .NET SDK
dotnet build프로젝트 단위 빌드.NET Core / .NET
mcsMono용 C# 컴파일러Linux, macOS, Unity

📋 Unity에서 C# 코드의 실행 과정

  1. .cs 코드 작성
  2. C# 컴파일러 (Mono, IL2CPP)CIL (Common Intermediate Language, 중간 언어)로 변환
    • C# 코드 → CIL로 변환 (.dll)
  3. 실행 시 Mono VM 또는 IL2CPP를 통해 네이티브 코드로 변환
  4. Garbage Collector (GC)가 메모리 관리 수행
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.