개요
.NET이란 무료이고, 여러 환경에서 사용할 수 있으며, 여러 응용프로그램을 빌드할 수 있는 오픈 소스 개발자 플랫폼이다. .Net은 여러 언어로 작성된 프로그램을 실행시킬 수 있으며, 개중 c#이 가장 대중적이다. .NET은 많은 대규모 앱에서 프로덕션 환경에 사용되는 고성능 런타임에 의존한다.
.NET 플랫폼은 생산성, 성능, 신뢰성을 제공하도록 디자인 되었다. .NET은 가비지 콜렉터를 통한 자동 메모리 관리를 제공한다. .Net은 GC(가비지 컬렉터)와 엄격한 언어 컴파일러를 사용하기 때문에 타입 안전성과 메모리 안전성을 가진다. .NET은 async/await와 Task 원시 데이터 타입(primitive)를 사용하여 동시성을 제공한다. .NET은 광범위한 기능을 가지며 다양한 운영 체제와 칩 아키텍처에서 성능에 최적화된 방대한 라이브러리 세트를 포함한다.
.NET은 다음의 디자인 특징들을 가진다:
- 생산성은 런타임, 라이브러리, 언어, 도구가 모두 개발자 사용자 경험에 기여하며 풀 스택으로 구현된다.
- 안전한 코드가 주된 계산 모델이나, 안전하지 않은 코드를 통해 추가적인 수동 최적화가 가능하게 된다.
- 정적 코드와 동적 코드 모두 지원되어, 광범위한 명확한 시나리오를 가능하게 한다.
- 네이티브 코드 상호 운용성 및 하드웨어 내장은 저비용 고충실도(원시 API 및 명령어 접근)이다.
- 코드는 플랫폼(OS 및 칩 아키텍처) 간에 이식 가능하며, 플랫폼 타겟팅은 전문화 및 최적화를 가능하게 한다.
- 프로그래밍 도메인(클라우드, 클라이언트, 게임) 전반의 적응성은 범용 프로그래밍 모델의 특수 구현을 통해 가능하게 된다.
- OpenTelemetry 및 gRPC와 같은 산업 표준이 맞춤형 솔루션보다 선호된다.
.NET은 마이크로소프트와 글로벌 커뮤니티가 협력하여 유지보수한다. 정기적인 업데이트는 사용자들이 안전하고 신뢰할 수 있는 애플리케이션을 프로덕션 환경에 배포하도록 보장한다.
구성 요소
.NET은 다음 구성 요소들을 포함한다:
- 런타임 — 애플리케이션 코드를 실행한다.
- 라이브러리 — JSON 구문 분석과 같은 유틸리티 기능을 제공한다.
- 컴파일러 — C# (및 다른 언어) 소스 코드를 (런타임) 실행 가능한 코드로 컴파일한다.
- SDK 및 기타 도구 — 현대적인 워크플로우로 앱을 빌드하고 모니터링하는 것을 가능하게 한다.
- 앱 스택 — ASP.NET Core 및 Windows Forms와 같이 앱 작성을 가능하게 한다.
런타임, 라이브러리, 그리고 언어는 .NET 스택의 기둥이다. .NET 도구와 같은 상위 수준 구성 요소와 ASP.NET Core와 같은 앱 스택은 이러한 기둥 위에 구축된다. **C#**은 .NET의 주요 프로그래밍 언어이며 .NET의 상당 부분이 C#으로 작성되었다.
C#은 객체 지향적이며 런타임은 객체 지향을 지원한다. C#은 가비지 컬렉션을 필요로 하며 런타임은 트레이싱 가비지 컬렉터를 제공한다. 라이브러리(및 앱 스택 또한)는 이러한 능력들을 개념과 객체 모델로 형성하여 개발자들이 직관적인 워크플로우에서 생산적으로 알고리즘을 작성할 수 있도록 한다.
핵심 라이브러리는 수천 개의 타입을 노출하며, 그 중 다수는 C# 언어와 통합되고 이를 강화한다. 예를 들어, C#의 foreach 문은 임의의 컬렉션을 열거하게 한다. 패턴 기반 최적화는 List<T>와 같은 컬렉션이 간단하고 효율적으로 처리되도록 한다. 리소스 관리는 가비지 컬렉션에 맡길 수 있지만, IDisposable과 using 문의 직접적인 언어 지원을 통해 즉각적인 정리가 가능하다.
거의 모든 워크로드에서 여러 작업을 동시에 처리하는 것은 아주 기본적이다. 이는 UI 반응성을 유지하면서 백그라운드 처리를 하는 클라이언트 애플리케이션일 수도 있고, 수천 개의 동시 요청을 처리하는 서비스일 수도 있으며, 수많은 동시 자극에 반응하는 장치일 수도 있다. 또는 컴퓨팅 집약적인 작업의 처리를 병렬화하는 고성능 머신일 수도 있다.
비동기 프로그래밍 지원은 C# 프로그래밍 언어의 핵심 기능이다. async 및 await 키워드를 제공하여 비동기 작업을 쉽게 작성하고 구성할 수 있게 하며, 동시에 언어가 제공하는 모든 제어 흐름 구성 요소의 이점을 온전히 누릴 수 있게 한다.
타입 시스템은 상당한 폭넓음을 제공하며, 안전성, 설명력, 동적 특성, 그리고 네이티브 상호 운용성에 거의 동등하게 부합한다. 무엇보다도, 타입 시스템은 객체 지향 프로그래밍 모델을 가능하게 한다. 이는 타입, (단일 기본 클래스) 상속, 인터페이스(기본 메서드 구현 포함), 그리고 가상 메서드 디스패치를 포함하여 객체 지향이 허용하는 모든 타입 계층화에 합리적인 동작을 제공한다. 제네릭 타입은 어디에나 존재하며 클래스를 하나 이상의 타입으로 특화시킬 수 있게 한다.
NET 런타임은 가비지 컬렉터를 통해 자동 메모리 관리를 제공한다. 어떤 언어든 메모리 관리 모델은 해당 언어의 가장 특징적인 부분이 될 가능성이 높다. 이는 .NET 언어에도 마찬가지이다. .NET은 **자동 튜닝되는 트레이싱 GC(garvage collector)**를 가지고 있다. 이는 일반적인 경우에는 ‘수동 개입이 없는’ 사용을 목표로 하며, 더 극단적인 워크로드에는 구성 옵션을 제공한다. 현재 GC는 다년간의 투자와 수많은 워크로드로부터 얻은 학습의 결과이다.
값 형식과 스택 할당 메모리 블록은 .NET의 GC 관리 타입들과 대조적으로, 데이터 및 네이티브 플랫폼과의 상호 운용에 대해 더 직접적이고 낮은 수준의 제어를 제공한다. 정수 타입과 같은 .NET의 대부분의 기본 타입들은 값 형식이며, 사용자들은 유사한 맥락을 가진 자신만의 타입을 정의할 수 있다. 값 형식은 .NET의 제네릭 시스템을 통해 완벽하게 지원되는데, 이는 List<T>와 같은 제네릭 타입이 값 형식 컬렉션의 평평하고 오버헤드 없는 메모리 표현을 제공할 수 있다는 것을 의미한다.
리플렉션은 프로그램을 데이터로 다루는 패러다임이다. 어셈블리, 타입, 멤버 측면에서 프로그램의 한 부분이 다른 부분을 동적으로 쿼리하고 호출하는 것을 허용한다. 이는 특히 늦은 바인딩 프로그래밍 모델과 도구에 유용하다.
예외는 .NET의 주요 오류 처리 모델이다. 예외는 오류 정보를 메서드 시그니처에 표현하거나 모든 메서드에서 처리할 필요가 없다는 이점을 가진다. 적절한 예외 처리는 애플리케이션의 안정성에 필수적이다. 앱이 충돌하는 것을 방지하기 위해, 코드에서 예상되는 예외를 의도적으로 처리할 수 있다. 충돌한 앱은 정의되지 않은 동작을 하는 앱보다 더 신뢰할 수 있고 진단 가능하다.
ASP.NET Core와 Windows Forms 같은 앱 스택은 하위 수준의 라이브러리, 언어, 런타임을 기반으로 구축되고 이를 활용한다. 이 앱 스택들은 앱이 구성되는 방식과 실행 수명 주기를 정의한다.
SDK 및 기타 도구는 개발자 데스크톱과 지속적 통합(CI) 환경 모두에서 현대적인 개발자 경험을 가능하게 한다. 현대적인 개발자 경험에는 코드를 빌드하고, 분석하며, 테스트하는 능력이 포함된다. .NET 프로젝트는 종종 단일 dotnet build 명령어로 빌드될 수 있는데, 이 명령은 NuGet 패키지 복원과 종속성 빌드를 조율한다.
NuGet은 .NET의 패키지 관리자이다. 수십만 개의 패키지를 포함하고 있으며, 이는 다양한 시나리오에 대한 기능을 구현한다. 대부분의 앱은 특정 기능을 위해 NuGet 패키지에 의존한다. NuGet 갤러리는 마이크로소프트에 의해 유지보수된다.
무료이고 오픈소스입니다
.NET은 무료이고 오픈 소스이며, .NET 재단 프로젝트이다. 마이크로소프트와 커뮤니티가 깃허브의 여러 저장소에서 .NET을 유지보수한다.
.NET 소스 코드와 바이너리는 MIT 라이선스로 제공된다. 윈도우에서는 추가 라이선스가 적용될 수 있다.
지원
.NET은 여러 조직의 지원을 받아 다양한 운영 체제에서 실행되고 최신 상태를 유지한다. Arm64, x64, x86 아키텍처에서 사용할 수 있다.
.NET의 새 버전은 릴리스 및 지원 정책에 따라 매년 11월에 출시된다. 패치는 매월 화요일(둘째 화요일), 일반적으로 태평양 표준시 오전 10시에 업데이트된다.
.NET 생태계
.NET에는 다양한 종류의 앱을 지원하는 여러 변형이 있다. 이러한 다양한 변형이 존재하는 이유는 부분적으로는 역사적인 배경 때문이고, 부분적으로는 기술적인 이유 때문이다.
.NET 구현체
- NET Framework — .NET의 원조이다. 윈도우 및 윈도우 서버의 광범위한 기능을 제공한다. 현재 활발하게 지원되며 유지보수 중이다.
- Mono — .NET의 원조 커뮤니티 및 오픈 소스 구현체이다. .NET Framework의 크로스 플랫폼 구현체이다. 안드로이드, iOS, WebAssembly를 위해 활발하게 지원된다.
- .NET (Core) — 현대적인 .NET이다. .NET의 크로스 플랫폼 및 오픈 소스 구현체로, 클라우드 시대를 위해 재고되었음에도 불구하고 .NET Framework와 상당한 호환성을 유지한다. 리눅스, macOS, 윈도우를 위해 활발하게 지원된다.