Object Orientation - 객체 지향
C#은 객체 지향성을 가진 언어로, 함수형 프로그래밍(함수를 객체처럼 사용 가능)도 가능하다.
다형성, 상속, 캡술화가 가능한 쓸모가 많은 Microsoft가 지원하는 훌륭한 프로그래밍 언어이다. Microsoft가 지원하는 부분이 많으며 Cross-Platform으로 다양한 기기에 배포될 수 있는 앱을 만들 수 있고, Web Backend 및 서버에서도 사용 가능하다.
Type Safety - 타입 안전성
Runtime이 아닌 Compile Time에 type을 체크하는 언어이다. 조금 더 안전하다!
Memory Management - 메모리 자동 관리
자동 메모리 관리를 해준다. 대부분에 HIgh-level Language가 그렇듯.. Java, Python ...
메모리 관리를 안 해주는 언어는 대표적으로 C, C++, Rust 등이 있다.
CLR, BCL, Runtime
모든 C# 애플리케이션은 기본적인 Runtime으로 CLR을 갖는다. Microsoft는 F#, Visual Basic, C#을 갖고 있으며 CLR을 통해 기기에 특화된 기계 언어 (Machine Code)로 변경한다. 그보다 위에 있는 BCL은 공통으로 C#이 지원하는 Collection(리스트, 덱, 힙) 등이 있으며 유용한 기능이 많다. Application Layer은 가장 위에 있는 계층으로 만들고자 하는 애플리케이션, 웹, 서버 등 사용자의 의도에 따라 결정된다.
CLR?
Common Language Runtime의 약자로, F#, Visual Basic, C# 등 메모리 관리가 자동화된 언어들의 공통 Runtime을 제공한다. C#은 managed language (메모리 관리 자동화)인 언어이다. C#을 개발자가 compile하게 되면 바로 기기에 종속되는 Native한 코드가 아닌, CLR이 이해할 수 있는 IL (Intermediate Language) 중간 언어로 변한다. 그리고 CLR은 이 IL을 특정 기기에 맞춰진 Native 코드로 바꾼다. 사용자가 CLR이 이해할 수 있는 IL로 바꾸는 과정은 애플리케이션 실행 전에 수행되는 (Ahead-of-time)이지만, 변형된 IL이 기기에 특화된 Native 코드로 바뀌면서 애플리케이션이 실행되는 과정은 JIT (Just-In-Time)으로 애플리케이션이 실행되기 전에 수행된다. 물론, Ahead-of-time도 가능하다. 모바일 (IOS, Android) 앱은 자원 관리가 중요하므로 JIT로 애플리케이션이 실행되는 비효율성 보다는 Ahead-Of-Time으로 낭비되는 자원을 최소화 해야 한다.
이런 Managed Code가 속한 container를 assembly (어셈블리 언어 아님)이라고 부른다. 각 assembly는 IL 뿐만이 아니라 metadata를 통해 다른 assembly에 속한 type까지 접근 가능하다.
BCL?
위에서 언급한 assembly에 BCL 이 포함된다. BCL은 Base Class Library의 약자로 코어 기능을 개발자에게 제공한다. Collection (리스트 등), Input/Output, text 가공, XML/JSON 파일 접근, 네트워킹, 암호화, 동시성, 병렬성 등등 애플리케이션 최적화 및 데이터 접근에 쓸모 있는 여러 기능을 제공한다.
BCL은 C# 언어 자체가 필요로 하는 기능도 제공한다. (ex, enumeration, querying, asynchrony). 또한 CLR이 제공하는 기능도 명시적으로(표면적으로) 접근 가능하게 한다. 예를 들어, Reflection(자기 자신의 assembly metadata에 접근), 메모리 관리 기능에 접근 가능하게 한다.
Runtime?
a.k.a. Framework. Runtime은 CLR + BCL + application layer (선택사항) 으로 이루어진다. 배포 가능하며 설치 가능하다. Application Layer은 사용자, 개발자의 필요에 따라 web, mobile, desktop 등 타겟하는 대상에 따라 변한다. Command-Line Console 앱 이나 UI Library가 필요 없다면 Application Layer는 사실 필요 없다.
애플리케이션을 만들 때, 특정 runtime을 대상으로 한다. 이 말은 애플리케이션이 runtime에 의존하고 종속된다는 뜻이다. 그만큼 runtime은 중요하다!
Application Layer | CLR / BCL | Program Type | 작동하는 기기 |
ASP.NET | .NET 8 | Web | Windows, Linux, macOS |
Windows Desktop | .NET 8 | Windows | Windows 10+ |
WinUI 3 | .NET 8 | Windows | Windows 10+ |
MAUI | .NET 8 | Mobile, desktop | iOS, Android, macOS, Windows10+ |
.NET Framework | .NET Framework | Web, Windows | Windows 7+ |
Microsoft 에서 만든 언어인 만큼 Windows를 타켓으로 하는 Runtime이 존재한다. Windows Desktop, WinUI3 Application Layer는 Windows 10 이상을 타켓으로하는 애플리케이션을 만들 수 있게한다. 하지만 C# NET 프레임워크의 장점은 Cross-Platform에서 발생한다고 생각한다. 이 Cross-Platform을 제공하는 Runtime은 .NET 8 (표에 CLR / BCL)이다.
.NET Framework는 Windows 운영체제에 자동으로 설치되어 있으며 (NET 8은 아님) 작동 기기가 Windows 7+로 오래됐음을 볼 수 있다.
Cross-Platform
Windows Desktop | WinUI 3 | MAUI | ASP.NET Core |
WPF | Windows Forms | Windows App SDK (10+) | Mobile & Cross Platform desktop | Web Applications (cross-platform) |
MAUI, 와 ASP.NET Core는 .NET8을 CLR/BCL로 하는 Application Layer 이며, Cross-Platform으로 Mobile, Desktop, Web 등 다양하게 배포 가능하다.
부차적 Runtime
Unity, UWP (Xbox, HoloLens, etc.) , .NET micro Framework 등이 있다.
'Computer Science > C#' 카테고리의 다른 글
WPF 클래스 (class) 개요 (0) | 2024.04.30 |
---|---|
WPF Thread 내부 원리 (0) | 2024.04.25 |