.NET 6의 새로운 기능

.NET 6은 .NET 5로 시작된 .NET 통합 계획의 마지막 부분을 제공합니다. .NET 6은 모바일, 데스크톱, IoT 및 클라우드 앱 전반에 걸쳐 SDK, 기본 라이브러리 및 런타임을 통합합니다. 이러한 통합 외에도 .NET 6 에코시스템은 다음을 제공합니다.

  • 간소화된 개발: 시작하는 것은 쉽습니다. C# 10의 새로운 언어 기능을 사용하면 작성해야 하는 코드의 양이 줄어듭니다. 그리고 웹 스택과 최소한의 API에 대한 투자를 통해 더 작고 빠른 마이크로 서비스를 쉽고 빠르게 작성할 수 있습니다.

  • 향상된 성능: .NET 6은 가장 빠른 전체 스택 웹 프레임워크로, 클라우드에서 실행하는 경우 컴퓨팅 비용을 낮춰줍니다.

  • 궁극적인 생산성: .NET 6 및 Visual Studio 2022는 핫 다시 로드, 새로운 Git 도구, 지능형 코드 편집, 강력한 진단 및 테스트 도구, 향상된 팀 협업을 제공합니다.

.NET 6은 LTS(장기 지원) 릴리스로 3년 동안 지원됩니다.

미리 보기 기능은 기본적으로 비활성화되어 있습니다. 또한 프로덕션 환경에서는 사용이 지원되지 않으며 향후 버전에서는 제거될 수 있습니다. 새로운 RequiresPreviewFeaturesAttribute는 미리 보기 API에 주석을 추가하는 데 사용되며 해당 분석기는 이러한 미리 보기 API를 사용하는 경우 경고를 표시합니다.

.NET 6은 Visual Studio 2022 및 Mac용 Visual Studio 2022(및 이후 버전)에서 지원됩니다.

이 문서에서는 .NET 6의 새로운 기능을 모두 다루지는 않습니다. 새로운 기능을 모두 확인하고 이 문서에 나열된 기능에 대한 추가 정보를 보려면 .NET 6 발표 블로그 게시물을 참조하세요.

성능

.NET 6에는 다양한 성능 개선이 포함되어 있습니다. 이 섹션에는 FileStream, 프로필 기반 최적화AOT 컴파일의 몇 가지 개선 사항이 나열되어 있습니다. 자세한 내용은 .NET 6의 성능 개선 블로그 게시물을 참조하세요.

FileStream

Windows에서 더 나은 성능과 안정성을 제공하기 위해 .NET 6용으로 System.IO.FileStream 형식이 다시 작성되었습니다. 이제 FileStream은 Windows에서 비동기 I/O용으로 만들어질 때 차단되지 않습니다. 자세한 내용은 .NET 6의 파일 IO 개선 블로그 게시물을 참조하세요.

프로필 기반 최적화

PGO(프로필 기반 최적화)는 JIT 컴파일러가 가장 자주 사용되는 형식 및 코드 경로 측면에서 최적화된 코드를 생성하는 곳입니다. .NET 6에는 동적 PGO가 도입되었습니다. 동적 PGO는 계층화된 컴파일과 함께 작동하여 계층 0 동안 배치된 추가 계측을 기반으로 코드를 더욱 최적화합니다. 동적 PGO는 기본적으로 사용하지 않도록 설정되어 있지만 DOTNET_TieredPGO환경 변수를 사용하여 사용하도록 설정할 수 있습니다. 자세한 내용은 JIT 성능 개선을 참조하세요.

Crossgen2

.NET 6에는 제거된 Crossgen의 후속 버전인 Crossgen2가 도입되었습니다. Crossgen 및 Crossgen2는 앱의 작동 시간을 개선하기 위해 AOT(Ahead-of-Time) 컴파일을 제공하는 도구입니다. Crossgen2는 C++가 아닌 C#으로 작성되었으며, 이전 버전에서는 불가능했던 분석과 최적화가 가능합니다. 자세한 내용은 Crossgen2에 대한 대화를 참조하세요.

Arm64 지원

.NET 6 릴리스에는 네이티브 Arm64 실행 및 x64 에뮬레이션 모두에 대해 macOS Arm64(또는 "Apple Silicon") 및 Windows Arm64 운영 체제에 대한 지원이 포함되어 있습니다. 또한 이제 x64 및 Arm64 .NET 설치 프로그램이 나란히 설치됩니다. 자세한 내용은 Arm64 및 x64용 macOS 11 및 Windows 11에 대한 .NET 지원을 참조하세요.

핫 다시 로드

핫 다시 로드는 앱의 소스 코드를 수정하고 해당 변경 내용을 실행 중인 앱에 즉시 적용할 수 있는 기능입니다. 이 기능의 목적은 편집 사이에 앱이 다시 시작되는 것을 방지하여 생산성을 높이는 것입니다. 핫 다시 로드는 Visual Studio 2022 및 dotnet watch 명령줄 도구에서 사용할 수 있습니다. 핫 다시 로드는 대부분의 .NET 앱 형식과 C#, Visual Basic 및 C++ 소스 코드에서 작동합니다. 자세한 내용은 핫 다시 로드 블로그 게시물을 참조하세요.

.NET MAUI

.NET 다중 플랫폼 앱 UI(.NET MAUI)는 아직 미리 보기 상태이며, 릴리스 후보는 2022년 1분기에 릴리스되고 GA(일반 공급)는 2022년 2분기에 릴리스됩니다. .NET MAUI를 사용하면 단일 코드베이스로 데스크톱 및 모바일 운영 체제용 네이티브 클라이언트 앱을 빌드할 수 있습니다. 자세한 내용은 .NET 다중 플랫폼 앱 UI 업데이트 블로그 게시물을 참조하세요.

C# 10 및 템플릿

C# 10에는 global using 지시문, 파일 범위 네임스페이스 선언, 레코드 구조체와 같은 혁신적인 기능이 포함되어 있습니다. 자세한 내용은 C# 10의 새로운 기능을 참조하세요.

해당 작업과 함께 C#용 .NET SDK 프로젝트 템플릿이 다음과 같은 몇 가지 새로운 언어 기능을 사용하도록 현대화되었습니다.

이러한 새로운 언어 기능을 프로젝트 템플릿에 추가하면 기능이 사용하도록 설정된 상태로 새 코드가 시작됩니다. 그러나 .NET 6으로 업그레이드해도 기존 코드는 영향을 받지 않습니다. 이러한 템플릿 변경 내용에 대한 자세한 내용은 .NET SDK: 현대화된 C# 프로젝트 템플릿 블로그 게시물을 참조하세요.

F# 및 Visual Basic

F# 6에는 F# 언어 및 F# 대화형에 몇 가지 개선 사항이 추가되었습니다. 자세한 내용은 F# 6의 새로운 기능을 참조하세요.

Visual Basic에서는 Visual Studio 환경 및 Windows Forms 프로젝트 시작이 개선되었습니다.

SDK 워크로드

.NET SDK의 크기를 더 작게 유지하기 위해 일부 구성 요소가 새로운 선택적 SDK 워크로드에 배치되었습니다. 이러한 구성 요소에는 .NET MAUI 및 Blazor WebAssembly AOT가 포함됩니다. Visual Studio를 사용하는 경우 필요한 SDK 워크로드 설치가 자동으로 처리됩니다. .NET CLI를 사용하는 경우 새로운 dotnet workload 명령을 사용하여 워크로드를 관리할 수 있습니다.

명령 설명
dotnet workload search 사용 가능한 워크로드를 검색합니다.
dotnet workload install 지정된 워크로드를 설치합니다.
dotnet workload uninstall 지정된 워크로드를 제거합니다.
dotnet workload update 설치된 워크로드를 업데이트합니다.
dotnet workload repair 설치된 모든 워크로드를 다시 설치하여 손상된 설치를 복구합니다.
dotnet workload list 설치된 워크로드를 나열합니다.

자세한 내용은 선택적 SDK 워크로드를 참조하세요.

System.Text.Json API

.NET 6의 System.Text.Json에서 많은 개선이 이루어져 이제 "산업용으로 강력한" 직렬화 솔루션이 되었습니다.

원본 생성기

.NET 6에서는 System.Text.Json에 대한 새로운 원본 생성기를 추가합니다. 원본 생성은 JsonSerializer와 함께 작동하며 다양한 방법으로 구성할 수 있습니다. 성능을 개선시키고 메모리 사용량을 줄이며 어셈블리 트리밍을 용이하게 할 수 있습니다. 자세한 내용은 System.Text.Json에서 리플렉션 또는 원본 생성을 선택하는 방법System.Text.Json에서 원본 생성을 사용하는 방법을 참조하세요.

쓰기 가능한 DOM

기존의 읽기 전용 DOM을 보완하는 새로운 쓰기 가능한 DOM(문서 개체 모델)이 추가되었습니다. 새로운 API는 POCO(Plain Old CLR Object) 형식을 사용할 수 없는 경우에 대한 간단한 직렬화 대안을 제공합니다. 또한 대규모 JSON 트리의 하위 섹션을 효율적으로 탐색하고 해당 하위 섹션에서 배열을 읽거나 POCO를 역직렬화할 수 있습니다. 쓰기 가능한 DOM을 지원하기 위해 다음과 같은 새로운 형식이 추가되었습니다.

자세한 내용은 JSON DOM 선택을 참조하세요.

IAsyncEnumerable serialization

System.Text.Json은 이제 IAsyncEnumerable<T> 인스턴스를 사용한 직렬화 및 역직렬화를 지원합니다. 비동기 직렬화 메서드는 개체 그래프의 모든 IAsyncEnumerable<T> 인스턴스를 열거한 다음 이를 JSON 배열로 직렬화합니다. 역직렬화를 위해 새 메서드 JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken)이 추가되었습니다. 자세한 내용은 IAsyncEnumerable 직렬화를 참조하세요.

기타 새로운 API

유효성 검사 및 기본값 설정을 위한 새로운 직렬화 인터페이스:

자세한 내용은 콜백을 참조하세요.

새로운 속성 순서 특성:

"원시" JSON을 작성하는 새로운 방법:

스트림에 대한 동기 직렬화 및 역직렬화:

직렬화 중에 참조 순환이 검색되면 개체를 무시하는 새로운 옵션:

System.Text.Json을 사용한 직렬화 및 역직렬화에 대한 자세한 내용은 .NET의 JSON 직렬화 및 역직렬화를 참조하세요.

HTTP/3

.NET 6에는 새로운 HTTP 버전인 HTTP/3에 대한 미리 보기 지원이 포함되어 있습니다. HTTP/3은 QUIC라는 새로운 기본 연결 프로토콜을 사용하여 일부 기존 기능 및 성능 문제를 해결합니다. QUIC은 연결을 더 빠르게 설정하고 연결이 IP 주소와 독립적이므로 모바일 클라이언트가 Wi-Fi와 셀룰러 네트워크 간에 로밍할 수 있습니다. 자세한 내용은 HttpClient와 함께 HTTP/3 사용을 참조하세요.

ASP.NET Core

ASP.NET Core에는 최소 API, Blazor WebAssembly 앱을 위한 AOT(Ahead-of-Time) 컴파일 및 단일 페이지 앱의 개선 사항이 포함되어 있습니다. 또한 이제 Blazor 구성 요소를 JavaScript에서 렌더링하고 기존 JavaScript 기반 앱과 통합할 수 있습니다. 자세한 내용은 ASP.NET Core 6의 새로운 기능을 참조하세요.

OpenTelemetry

.NET 6에서는 소프트웨어의 성능과 동작을 분석하는 데 도움이 되는 도구, API 및 SDK 컬렉션인 OpenTelemetry에 대한 개선된 지원을 제공합니다. System.Diagnostics.Metrics 네임스페이스의 API는 OpenTelemetry Metrics API 사양을 구현합니다. 예를 들어, 다양한 측정 시나리오를 지원하는 4가지 계측 클래스가 있습니다. 계측 클래스는 다음과 같습니다.

보안

.NET 6에는 CET(제어 흐름 적용 기술) 및 W^X(Write Exclusive Execution)라는 두 가지 주요 보안 완화에 대한 미리 보기 지원이 추가되었습니다.

CET는 일부 최신 Intel 및 AMD 프로세서에서 사용할 수 있는 Intel 기술입니다. 일부 제어 흐름 하이재킹 공격으로부터 보호하는 기능을 하드웨어에 추가합니다. .NET 6은 Windows x64 앱용 CET에 대한 지원을 제공하며 이를 명시적으로 사용하도록 설정해야 합니다. 자세한 내용은 Intel CET 섀도 스택과의 .NET 6 호환성을 참조하세요.

W^X는 .NET 6이 설치된 모든 운영 체제에서 사용할 수 있지만 Apple Silicon에서는 기본적으로만 사용하도록 설정됩니다. W^X는 메모리 페이지에 쓰기 및 실행이 동시에 허용되지 않도록 하여 가장 간단한 공격 경로를 차단합니다.

IL 트리밍

자체 포함 배포의 트리밍이 개선되었습니다. .NET 5에서는 사용되지 않는 어셈블리만 트리밍되었습니다. .NET 6은 사용되지 않는 형식 및 멤버의 트리밍도 추가합니다. 또한 트리밍으로 인해 런타임에 사용되는 코드가 제거될 수 있는 위치를 알려 주는 자르기 경고가 이제 기본적으로 사용하도록 설정됩니다. 자세한 내용은 자체 포함 배포 및 실행 파일 트리밍을 참조하세요.

코드 분석

.NET 6 SDK에는 API 호환성, 플랫폼 호환성, 트리밍 안전성, 문자열 연결 및 분할 시 범위 사용, 더 빠른 문자열 API 및 더 빠른 컬렉션 API와 관련된 몇 가지 새로운 코드 분석기가 포함되어 있습니다. 새로운 분석기 및 제거된 분석기의 전체 목록을 보려면 Analyzer 릴리스 - .NET 6을 참조하세요.

사용자 지정 플랫폼 가드

플랫폼 호환성 분석기OperatingSystem 클래스의 Is<Platform> 메서드(예: OperatingSystem.IsWindows())를 플랫폼 가드로 인식합니다. 사용자 지정 플랫폼 가드를 허용하기 위해 .NET 6에는 지원되거나 지원되지 않는 플랫폼 이름으로 필드, 속성 또는 메서드에 주석을 추가하는 데 사용할 수 있는 두 가지 새로운 특성이 도입되었습니다.

Windows Forms

Application.SetDefaultFont(Font)는 애플리케이션 전체에서 기본 글꼴을 설정하는 .NET 6의 새로운 메서드입니다.

C# Windows Forms 앱용 템플릿이 global using 지시문, 파일 범위 네임스페이스 및 null 허용 참조 형식을 지원하도록 업데이트되었습니다. 또한 여기에는 상용구 코드를 줄이고 Windows Forms 디자이너가 기본 글꼴로 디자인 화면을 렌더링할 수 있도록 하는 애플리케이션 부트스트랩 코드가 포함되어 있습니다. 부트스트랩 코드는 Application.EnableVisualStyles()와 같은 다른 구성 메서드에 대한 호출을 내보내는 원본 생성 메서드인 ApplicationConfiguration.Initialize()에 대한 호출입니다. 또한 ApplicationDefaultFont MSBuild 속성을 통해 기본이 아닌 글꼴을 설정하면 ApplicationConfiguration.Initialize()SetDefaultFont(Font)에 대한 호출을 내보냅니다.

자세한 내용은 Windows Forms의 새로운 기능 블로그 게시물을 참조하세요.

원본 빌드

.NET SDK의 모든 원본이 포함된 원본 tarball은 이제 .NET SDK 빌드의 제품입니다. Red Hat과 같은 다른 조직에서는 이 원본 tarball을 사용하여 자체 SDK 버전을 빌드할 수 있습니다.

대상 프레임워크 모니커

추가 OS별 TFM(대상 프레임워크 모니커)이 .NET 6에 추가되었습니다(예: net6.0-android, net6.0-iosnet6.0-macos). 자세한 내용은 .NET 5+ OS별 TFM을 참조하세요.

제네릭 수학

미리 보기에는 .NET 6의 제네릭 형식에 연산자를 사용하는 기능이 있습니다. .NET 6에는 C# 10의 새로운 미리 보기 기능인 static abstract 인터페이스 멤버를 활용하는 다양한 인터페이스가 도입되었습니다. 이러한 인터페이스는 다양한 연산자에 해당합니다. 예를 들어, IAdditionOperators+ 연산자를 나타냅니다. 인터페이스는 System.Runtime.Experimental NuGet 패키지에서 사용할 수 있습니다. 자세한 내용은 일반 수학 블로그 게시물을 참조하세요.

NuGet 패키지 유효성 검사

NuGet 라이브러리 개발자라면 새로운 패키지 유효성 검사 도구를 사용하여 패키지가 일관되고 올바른 형식인지 유효성을 검사할 수 있습니다. 다음 사항을 확인할 수 있습니다.

  • 패키지 버전 전반에 걸쳐 호환성이 손상되는 변경이 있습니다.
  • 패키지에는 모든 런타임별 구현에 대해 동일한 공용 API 집합이 있습니다.
  • 대상 프레임워크 또는 런타임 적용 가능성에 차이가 있습니다.

자세한 내용은 패키지 유효성 검사 블로그 게시물을 참조하세요.

리플렉션 API

.NET 6에는 코드를 검사하고 Null 허용 여부 정보를 제공하는 다음과 같은 새로운 API가 도입되었습니다.

이러한 API는 리플렉션 기반 도구 및 직렬 변환기에 유용합니다.

Microsoft.Extensions API

다음 표에 표시된 것처럼 .NET 6에서는 여러 확장 네임스페이스가 개선되었습니다.

네임스페이스 개선
Microsoft.Extensions.DependencyInjection CreateAsyncScope를 사용하면 IAsyncDisposable 서비스를 등록하는 서비스 공급자에 대해 using 문을 안전하게 사용할 수 있습니다.
Microsoft.Extensions.Hosting 새로운 ConfigureHostOptions 메서드는 애플리케이션 설정을 간소화합니다.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging에는 고성능 로깅 API를 위한 새로운 원본 생성기가 있습니다. 새 LoggerMessageAttributepartial 로깅 메서드에 추가하면 원본 생성기가 트리거됩니다. 컴파일 시간에 생성기는 일반적으로 기존 로깅 솔루션보다 런타임 속도가 더 빠른 partial 메서드의 구현을 생성합니다. 자세한 내용은 컴파일 시간 로깅 원본 생성을 참조하세요.

새로운 LINQ API

.NET 6에는 다양한 LINQ 메서드가 추가되었습니다. 다음 표에 나열된 대부분의 새 메서드에는 System.Linq.Queryable 형식의 동등한 메서드가 있습니다.

메서드 설명
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) 열거형을 강제하지 않고 시퀀스의 요소 수를 확인하려고 시도합니다.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) 시퀀스의 요소를 지정된 크기의 청크로 분할합니다.
Enumerable.MaxByEnumerable.MinBy 키 선택기를 사용하여 최대 또는 최소 요소를 찾습니다.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectByEnumerable.UnionBy 집합 기반 작업을 수행하는 이러한 새로운 메서드 변형을 사용하면 키 선택기 함수를 사용하여 동일성을 지정할 수 있습니다.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index)Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) 시퀀스의 시작이나 끝에서 계산된 인덱스를 허용합니다. 예를 들어, Enumerable.Range(1, 10).ElementAt(^2)9를 반환합니다.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource)Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource)Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource)Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
새로운 오버로드를 사용하면 시퀀스가 비어 있는 경우 사용할 기본값을 지정할 수 있습니다.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>)Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) 새로운 오버로드를 사용하면 비교자를 지정할 수 있습니다.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) 시퀀스 조각 가져오기를 간소화하기 위해 Range 인수를 허용합니다. 예를 들어, source.Take(7).Skip(2) 대신 source.Take(2..7)을 사용할 수 있습니다.
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) 지정된 3개 시퀀스의 요소로 튜플 시퀀스를 생성합니다.

날짜, 시간, 표준 시간대 개선

.NET 6에는 System.DateOnlySystem.TimeOnly라는 두 구조체가 추가되었습니다. 이는 각각 DateTime의 날짜 부분과 시간 부분을 나타냅니다. DateOnly는 생일이나 기념일에 유용하고, TimeOnly는 일별 경보 및 주간 업무 시간에 유용합니다.

이제 표준 시간대 데이터가 설치된 모든 운영 체제에서 IANA(Internet Assigned Numbers Authority) 또는 Windows 표준 시간대 ID를 사용할 수 있습니다. 요청된 표준 시간대가 시스템에 없는 경우 입력을 Windows 표준 시간대에서 IANA 표준 시간대로(또는 그 반대로) 자동으로 변환하도록 TimeZoneInfo.FindSystemTimeZoneById(String) 메서드가 업데이트되었습니다. 또한 한 표준 시간대 형식에서 다른 표준 시간대 형식으로 수동으로 변환해야 하는 시나리오를 위해 새로운 메서드 TryConvertIanaIdToWindowsId(String, String)TryConvertWindowsIdToIanaId가 추가되었습니다.

다른 표준 시간대 개선 사항도 몇 가지 있습니다. 자세한 내용은 .NET 6의 날짜, 시간 및 표준 시간대 개선 사항을 참조하세요.

PriorityQueue 클래스

PriorityQueue<TElement,TPriority> 클래스는 값과 우선 순위를 모두 갖는 항목 컬렉션을 나타냅니다. 항목은 우선 순위가 높아지는 순서대로 큐에서 제거됩니다. 즉, 우선 순위 값이 가장 낮은 항목이 먼저 큐에서 제거됩니다. 이 클래스는 최소 힙 데이터 구조를 구현합니다.

참고 항목