C#은 11월에 유니언 타입을 도입합니다 - F#과 Rust에 가까워지는 언어 개선

개발 & 코딩 Sep 3, 2026북마크에 추가

C#은 11월에 유니언 타입을 도입합니다 - F#과 Rust에 가까워지는 언어 개선

마이크로소프트가 The Register를 통해 2026년 11월에 C#에 유니언 타입이 도입될 것을 확인했습니다. TypeScript, Rust, Swift, F#가 오랫동안 제공해 온 기능으로, C#에서 비즈니스 상태를 모델링하는 방식을 바꿀 것입니다.

구체적인 사례

C#에서 세 가지 서로 다른 형태를 가질 수 있는 상태를 나타내기 위해 이와 같은 코드를 얼마나 자주 작성해 왔습니까?

public class RésultatPaiement
{
 public bool EstSuccès { get; set; }
 public string? IdTransaction { get; set; }
 public bool EstEnAttente { get; set; }
 public string? RaisonAttente { get; set; }
 public bool EstErreur { get; set; }
 public string? CodeErreur { get; set; }
 public string? MessageErreur { get; set; }
}

세 개의 boolean이 서로를 배타적으로 배제하는 객체, 특정 boolean과 조합할 때만 의미를 갖는 다섯 개의 nullable 필드, 그리고 if/else에서 모든 경우를 빠뜨리지 않았는지 보장할 수 없는 컴파일러.这就是约定에 의한 모델링, 즉 개발자의 규율에 의존하는 방식입니다—多くの信頼性はありません。

발생하는 일

The Register는 2026년 9월 2일, Microsoft가 C#에서 2026년 11월에 union types—즉 「discriminated unions」 또는 「sum types」—를 도입할 것이라고 확인했다고 보도했습니다.

핵심은 간단합니다: 성공, 대기, 오류라는 세 가지 배타적 상태를 나타내는 객체에 다섯 개의 필드를 두는 대신, 컴파일러에게 해당 타입이 세 가지 배타적 경우 중 하나이며 각 경우에 맞는 필드를 명시적으로 선언하는 것입니다.

의사 코드 C#(최종 구문은 공식 발표될 예정)로는 다음과 같습니다:

public union RésultatPaiement
{
 Succès(string IdTransaction);
 Attente(string Raison);
 Erreur(string Code, string Message);
}

// 사용 예
switch (résultat)
{
 case RésultatPaiement.Succès s:
 Console.WriteLine($"거래 {s.IdTransaction}");
 break;
 case RésultatPaiement.Attente a:
 Console.WriteLine($"대기 중: {a.Raison}");
 break;
 case RésultatPaiement.Erreur e:
 Console.WriteLine($"오류 {e.Code}: {e.Message}");
 break;
 // 컴파일러가 누락된 경우를 감지합니다
}

컴파일러는 switch완전성을 검사합니다: 한 가지 경우를 빠뜨렸다면, 여섯 달 후에 발견되는 프로덕션 버그가 아니라 컴파일 오류가 됩니다.

왜 중요한가

.NET 생태계에서 C#의 함수형 사촌인 F#는 항상 discriminated unions를 제공해 왔습니다—이는 언어의 주요 판매 포인트 중 하나입니다. Rust는 이를 디자인 핵심 요소로 삼았습니다(유명한 enummatch). Swift도 마찬가지입니다. TypeScript는 2015년부터 union types를 지원했습니다. Kotlin은 유사한 패턴을 제공하는 sealed class를 도입했습니다. C#은 뒤처져 있었습니다—개발자들은 추상 클래스 계층, sealed record, 서드파티 라이브러리의 OneOf<T1,T2,T3> 등으로 우회해야 했습니다.

이 기능 도입의 세 가지 구체적인 결과:

  1. 비즈니스 모델링이 더 honest해집니다. 관례에 의해 표현하던 배타적 상태들이 타입으로 변환됩니다. 컴파일러가 모든 경우를 빠뜨리지 않도록 돕습니다.
  2. OneOfLanguageExt 같은 라이브러리들이 재정비될 것입니다. 이들이 제공하던 기능 중 일부가 내장됩니다. 나머지는(모나드, 부분 적용 등)는 여전히 유용할 것입니다.
  3. C#과 F#의 경계가 더 모호해집니다. F#은 타입 추론, 파이프라인 |>, 기본 불변성 등 장점을 유지하겠지만, 격차가 좁혀집니다—프로젝트에서 어떤 언어를 선택할지에 대한 고민이 달라질 것입니다.

실행 전 확인해야 할 사항

  • 최종 구문: Microsoft는 아직 공식 사양을 발표하지 않았습니다. 위의 예제는 설명용입니다.
  • 상호 운용성: C# union이 JSON으로 직렬화되거나, Entity Framework에서 어떻게 동작하거나, WCF/gRPC에서 어떻게 노출되는지 등. 이러한 세부 사항이 실제 채택을 결정할 것입니다.
  • 호환성: union은 .NET 10과 함께 C# 14+에서 도입될 가능성이 높습니다. .NET Framework 또는 .NET 8 LTS 프로젝트는 기다려야 할 것입니다.

기억해야 할 점

C#의 union types는 Mads Torgersen(C# lead design)의 편집 방침에 따라 F#의 아이디어가 C#에 유입된 것입니다. 우리 프로젝트에서 가장 즉각적인 이점은 API 결과(성공/오류/부분)워크플로우 상태(초안/검토 중/게시됨), 다형성 페이로드(event sourcing, Kafka 메시지) 모델링입니다.

혁신적이지는 않습니다—다른 주요 언어들은 이미 10년 전에 이를 도입했습니다. 하지만 비즈니스 로직에서 C#이 여전히 지배적인 .NET 생태계에서, 이는 타입 안전성의 질적 도약입니다. 11월 프리뷰 버전부터 테스트해 보세요.

C# 14의 새로운 기능: union types

C# 14에서 도입될 union types는 F#의 discriminated unions와 유사한 기능을 제공합니다. 세 가지 배타적 상태를 타입으로 명확히 모델링할 수 있으며, 컴파일러가 switch문의 완전성을 검사합니다. 이는 API 결과나 워크플로우 상태 모델링에 유용합니다.

F# vs C#: discriminated unions의 비교

F#의 discriminated unions는 C#의 union types와 유사하지만, 더 강력한 타입 추론과 불변성, 파이프라인 연산자를 제공합니다. C# 14에서 union types가 도입되면서 두 언어의 경계가 모호해졌습니다.

Resources

인공지능이 작성하고 사람의 편집 감독하에 검수한 기사입니다.

편집팀
Your Linux server, as a desktop.
TermalOSSponsored
Ops, reimagined

Your Linux server, as a desktop.

Agentless SSH monitoring, a full remote desktop and an AI ops copilot — no agents to install, everything stays on your machine.

SSHSelf-hostedAI Ops
Get early access
이 기사가 도움이 되었나요?

19 명이 이 기사를 좋아합니다

좋아요
K
Kaito KuroganeSenior Dev Writer
Senior polyvalent developer, backend Go + frontend TS, open source contributor.
공유:
Your Linux server, as a desktop.
TermalOSSponsored
Ops, reimagined

Your Linux server, as a desktop.

Agentless SSH monitoring, a full remote desktop and an AI ops copilot — no agents to install, everything stays on your machine.

Get early access
LIVERadio Geek Kitsune
눌러서 청취, 모두에게 같은 소리
0··
// 편성표
// all stations
// 트랙 공유 →
토픽
탐색
정보