푸터 콘텐츠로 바로가기
.NET 도움말

C# Discriminated Unions (개발자를 위한 동작 방식)

IronPDF를 사용하여 동적 PDF 생성을 하는 .NET 개발자로서, 다양한 종류의 문서 데이터, 로그 메시지, 사용자 역할 또는 내보내기 옵션과 같은 특정 유형을 나타내고 관리해야 할 때가 많습니다. 이때 C# 차별화된 합집합의 개념이 도입됩니다.

C#은 F#이나 Rust와 같이 차별화된 합집합에 대한 기본 지원이 없지만, 이를 효과적으로 시뮬레이트할 수 있습니다. 이 블로그 포스트에서는 C#에서 차별화된 합집합 타입을 정의하고 사용하는 방법, IronPDF와 함께 실제 PDF 처리에 적용하는 방법, 특히 패턴 매칭과 함께 사용할 때 이 패턴이 제공하는 이점을 살펴보겠습니다.

What Are Discriminated Unions in C#?

차별화된 합집합, 태그가 붙은 합집합 또는 합집합 타입으로도 알려져 있으며, 변수에 제한된 옵션 집합에서 하나의 값을 보유하게 하고 각 옵션은 고유한 케이스 식별자와 연관됩니다.

F#과 같은 다른 언어에서는 union 키워드를 사용하여 이를 정의할 수 있습니다. C#은 이 기능을 기본적으로 제공하지 않지만, 개발자는 record, 클래스 및 switch 표현식의 똑똑한 조합을 사용하여 이를 모방할 수 있습니다.

예를 들어:

public abstract record PdfAction;
public record GenerateReport(string ReportName) : PdfAction;
public record LogError(string Message) : PdfAction;
public record ExportToExcel(string FilePath) : PdfAction;
public abstract record PdfAction;
public record GenerateReport(string ReportName) : PdfAction;
public record LogError(string Message) : PdfAction;
public record ExportToExcel(string FilePath) : PdfAction;
Public MustOverride ReadOnly Property PdfAction() As record
public record GenerateReport(String ReportName) : PdfAction
public record LogError(String Message) : PdfAction
public record ExportToExcel(String FilePath) : PdfAction
$vbLabelText   $csharpLabel

위의 각 record는 합집합의 단일 케이스를 나타냅니다. 기본 PdfAction 타입이 구분자입니다.

IronPDF 워크플로우에서 차별화된 합집합이 중요한 이유

IronPDF를 사용하여 PDF 보고서 생성기를 구축하고 있으며, 사용자의 입력에 따라 다른 작업을 수행해야 하는 상황을 상상해 보십시오—PDF 생성, 오류 로그 기록, 데이터 내보내기 등이 있을 수 있습니다.

C#에서 차별화된 합집합을 사용하면 이러한 옵션 타입을 깔끔하게 표현할 수 있으며, 컴파일 타임 안전성, 버그 감소, 더 명확한 로직을 갖게 됩니다.

IronPDF와 함께 사용할 수 있는 방법은 다음과 같습니다.

void HandlePdfAction(PdfAction action)
{
    switch (action)
    {
        case GenerateReport r:
            var pdf = new IronPdf.HtmlToPdf().RenderHtmlAsPdf("<h1>" + r.ReportName + "</h1>");
            pdf.SaveAs(r.ReportName + ".pdf");
            break;
        case LogError e:
            Console.WriteLine("Logging Error: " + e.Message);
            break;
        case ExportToExcel x:
            Console.WriteLine("Exporting to Excel at " + x.FilePath);
            break;
        default:
            throw new NotSupportedException("Unknown action");
    }
}
void HandlePdfAction(PdfAction action)
{
    switch (action)
    {
        case GenerateReport r:
            var pdf = new IronPdf.HtmlToPdf().RenderHtmlAsPdf("<h1>" + r.ReportName + "</h1>");
            pdf.SaveAs(r.ReportName + ".pdf");
            break;
        case LogError e:
            Console.WriteLine("Logging Error: " + e.Message);
            break;
        case ExportToExcel x:
            Console.WriteLine("Exporting to Excel at " + x.FilePath);
            break;
        default:
            throw new NotSupportedException("Unknown action");
    }
}
Private Sub HandlePdfAction(ByVal action As PdfAction)
	Select Case action
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case GenerateReport r:
		Case GenerateReport r
			Dim pdf = (New IronPdf.HtmlToPdf()).RenderHtmlAsPdf("<h1>" & r.ReportName & "</h1>")
			pdf.SaveAs(r.ReportName & ".pdf")
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case LogError e:
		Case LogError e
			Console.WriteLine("Logging Error: " & e.Message)
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case ExportToExcel x:
		Case ExportToExcel x
			Console.WriteLine("Exporting to Excel at " & x.FilePath)
		Case Else
			Throw New NotSupportedException("Unknown action")
	End Select
End Sub
$vbLabelText   $csharpLabel

이 접근 방식은 코드의 정리 및 강화를 유지하고, 모든 가능한 옵션을 한 곳에서 이해하기 쉽게 만들어 줍니다.

Simulating Discriminated Unions in C# – Struct vs. Record vs. Class

C#에는 union 키워드가 없지만, 차별화된 합집합을 다음과 같이 시뮬레이션할 수 있습니다:

  • record: 불변 데이터에 이상적이며, 패턴 매칭을 깔끔하게 지원합니다.
  • 클래스: 상속 및 참조 의미론에 유연성이 더 높습니다.
  • 구조체: 값 타입에 유용하지만, 참조 타입 및 상속을 다룰 때 덜 유연합니다.

C# 판별된 유니온(개발자를 위한 작동 방식): 그림 1 - 구조체 대 레코드 대 클래스

성능 및 메모리 레이아웃이 중요한 경우—예를 들어, 높은 처리량의 PDF 로그에—구조체 차별화된 합집합을 신중하게 사용하는 것을 고려할 수 있습니다:

public interface IAction { }
public readonly struct SaveAction : IAction
{
    public string FileName { get; }
    public SaveAction(string fileName) => FileName = fileName;
}
public interface IAction { }
public readonly struct SaveAction : IAction
{
    public string FileName { get; }
    public SaveAction(string fileName) => FileName = fileName;
}
Public Interface IAction
End Interface
'INSTANT VB WARNING: VB has no equivalent to the C# readonly struct:
'ORIGINAL LINE: public readonly struct SaveAction : IAction
Public Structure SaveAction
	Implements IAction

	Public ReadOnly Property FileName() As String
	Public Sub New(ByVal fileName As String)
		Me.FileName = fileName
	End Sub
End Structure
$vbLabelText   $csharpLabel

참고: 특히 switch 표현식에 의존할 때, 구조체로 인해 패턴 매칭의 일부 이점을 잃을 수 있습니다.

Benefits of Using Discriminated Unions in C

이 소프트웨어 엔지니어링 패턴을 채택하는 데에는 몇 가지 중요한 장점이 있습니다:

  • 컴파일 타임 안전성: 런타임 전에 switch 표현식에서 누락된 케이스를 발견할 수 있습니다.
  • 더 명확한 로직: 케이스에 이름이 붙어 있어 동작을 작성, 주석 처리, 그리고 이유를 쉽게 이해할 수 있습니다.
  • 관심사의 분리: 타입 계층보다는 데이터에 기반한 동작을 분리합니다.
  • 리팩토링의 용이성: 케이스를 추가하거나 제거하는 것이 더 단순해집니다.

IronPDF와 함께 사용할 때, 이는 사용자 입력 관리, 렌더링 로직 또는 다양한 값 파이프라인을 통해 동적 템플릿을 작성하는 것을 더 쉽게 만들어 줍니다.

IronPDF와 함께 차별화된 합집합을 사용할 때

이 패턴이 우수한 성과를 거두는 몇 가지 실용적인 시나리오가 있습니다:

  • PDF 생성 워크플로우: 문서 수명 주기의 다른 단계 (생성, 저장, 이메일).
  • 권한 모델: 다양한 사용자 접근 수준을 나타냅니다.
  • 로깅 시스템: 로그 수준(정보, 오류, 디버그)을 위해 구별된 유니언 타입을 사용합니다.
  • 단위 테스트: 유지 가능한 논리 트리를 위한 테스트 작업을 유니언 타입으로 정의합니다.
  • 내보내기 옵션: PDF, Excel, Word와 같은 출력 대상을 유니언 인스턴스로 나타냅니다.

C# 판별된 유니온(개발자를 위한 작동 방식): 그림 2 - .NET 앱에서 판별된 유니온의 일반적인 시나리오

예제 – UI 이벤트에서 PDF 작업 처리하기

UI 이벤트를 캡처하고 이를 구별된 유니언을 사용하여 IronPDF 작업으로 라우팅하고자 한다고 가정해 봅시다:

public abstract record UserAction;
public record GeneratePdf(string HtmlContent, string FileName) : UserAction;
public record ShowMessage(string Text) : UserAction;
public record ExitApplication() : UserAction;
void OnUserEvent(UserAction action)
{
    switch (action)
    {
        case GeneratePdf pdf:
            var renderer = new IronPdf.HtmlToPdf();
            var document = renderer.RenderHtmlAsPdf(pdf.HtmlContent);
            document.SaveAs(pdf.FileName);
            break;
        case ShowMessage msg:
            MessageBox.Show(msg.Text);
            break;
        case ExitApplication:
            Application.Exit();
            break;
    }
}
public abstract record UserAction;
public record GeneratePdf(string HtmlContent, string FileName) : UserAction;
public record ShowMessage(string Text) : UserAction;
public record ExitApplication() : UserAction;
void OnUserEvent(UserAction action)
{
    switch (action)
    {
        case GeneratePdf pdf:
            var renderer = new IronPdf.HtmlToPdf();
            var document = renderer.RenderHtmlAsPdf(pdf.HtmlContent);
            document.SaveAs(pdf.FileName);
            break;
        case ShowMessage msg:
            MessageBox.Show(msg.Text);
            break;
        case ExitApplication:
            Application.Exit();
            break;
    }
}
Public MustOverride ReadOnly Property UserAction() As record
public record GeneratePdf(String HtmlContent, String FileName) : UserAction
public record ShowMessage(String Text) : UserAction
public record ExitApplication() : UserAction
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'void OnUserEvent(UserAction action)
'{
'	switch (action)
'	{
'		case GeneratePdf pdf:
'			var renderer = New IronPdf.HtmlToPdf();
'			var document = renderer.RenderHtmlAsPdf(pdf.HtmlContent);
'			document.SaveAs(pdf.FileName);
'			break;
'		case ShowMessage msg:
'			MessageBox.Show(msg.Text);
'			break;
'		case ExitApplication:
'			Application.@Exit();
'			break;
'	}
'}
$vbLabelText   $csharpLabel

이렇게 하면 이벤트를 명확한 논리로 표현할 수 있으며, 공개 오브젝트 타입이나 과도한 동적 처리에 대한 의존도를 줄일 수 있습니다.

Future Outlook – Will C# Ever Support Native Discriminated Unions?

더 많은 표현력 있는 타입 시스템에 대한 수요가 증가함에 따라 C#에서 구별된 유니언에 대한 네이티브 지원을 추가하자는 제안이 이미 나왔습니다. 언어는 아직 진정한 유니언 키워드를 도입하지 않았지만, C#은 점점 발전하고 있으며 레코드, 패턴 매칭, 스위치 식과 같은 기능이 구별된 유니언 기능에 더 가까워지고 있습니다.

최신 기능 친화적인 언어 구성에 관심이 있는 .NET 개발자는 이 공간을 주목해야 합니다.

마지막으로

네이티브 지원이 없더라도 C#에서 구별된 유니언을 사용하면 IronPDF 애플리케이션에서 논리 구조와 표현 방식을 크게 향상시킬 수 있습니다. 레코드, 스위치 식 및 기본 클래스를 활용함으로써 코드베이스를 더 읽기 쉽고 유지 관리하며, 오류에 강한 상태로 만들 수 있으며, 더 선언적이고 표현적인 방식으로 PDF 관련 작업을 처리할 수 있습니다.

현대적이고 유연한 .NET 애플리케이션을 구축하는 소프트웨어 엔지니어라면, 이 패턴은 도구 키트의 필수품입니다.

오늘 IronPDF 무료 체험해보세요

C# PDF 생성을 다음 단계로 발전시키시겠습니까? IronPDF를 다운로드하고 무료 체험판으로 시작하세요. HTML에서 문서를 생성하거나, 내보내기를 기록하거나, 구별된 유니언을 사용하여 보고서를 자동화하든 관계없이—IronPDF는 앱에 필요한 성능과 신뢰성을 제공합니다.

자주 묻는 질문

C#에서 구분된 유니언을 어떻게 구현할 수 있나요?

C#에서는 기본 클래스와 각 경우를 나타내기 위한 여러 파생 클래스를 정의하여 구분된 유니언을 시뮬레이션할 수 있습니다. 패턴 매칭과 결합하여 여러 관련 데이터 유형을 효과적으로 관리할 수 있습니다.

구분된 유니언에서 패턴 매칭의 역할은 무엇인가요?

C#에서 패턴 매칭은 구분된 유니언을 다룰 때 중요하며, 이를 통해 유니언의 각 경우를 간결하게 처리할 수 있어 코드 가독성을 개선하고 복잡한 조건문을 줄일 수 있습니다.

C#에서 구분된 유니언은 열거형과 어떻게 비교되나요?

구분된 유니언과 열거형은 둘 다 옵션의 고정 세트를 정의할 수 있도록 하지만, 구분된 유니언은 서로 다른 유형의 데이터를 포함할 수 있어 더 많은 유연성을 제공합니다. 반면 열거형은 단일 데이터 유형의 이름 있는 상수로 제한됩니다.

Iron Software를 사용하여 구분된 유니언과 함께 데이터 조작을 강화할 수 있나요?

네, IronPDF와 같은 Iron Software 제품은 구분된 유니언을 보완하여 고급 데이터 처리 및 처리 기능을 제공하여 .NET 응용 프로그램에서 다양한 유형의 데이터를 보다 쉽게 조작하고 표현할 수 있게 합니다.

C#에서 구분된 유니언을 사용하는 것의 장점은 무엇인가요?

구분된 유니언은 특정 가능한 형태를 가진 유형을 정의할 수 있게 함으로써 타입 안전성, 명확성 및 코드 유지보수를 개선합니다. 이는 강력한 타입 검사와 오류를 줄이는 데 도움이 됩니다.

구분된 유니언을 사용하면 코드 가독성에 어떤 영향을 미치나요?

개발자가 여러 관련 데이터 유형을 명확히 정의하고 처리할 수 있도록 하여 코드 가독성을 개선합니다. 패턴 매칭은 복잡한 조건 논리를 줄여 코드를 더욱 간단하게 만듭니다.

C#에서 구분된 유니언을 시뮬레이션하기 위해 클래스를 사용하는 것의 중요성은 무엇인가요?

C#에서 클래스에 의해 구분된 유니언을 시뮬레이션하는 것은 각 경우에 대해 파생 클래스를 가진 기본 클래스를 생성하는 것을 포함하며, 관련 유형을 모델링하는 유연하고 표현력이 높은 방법을 제공합니다. 이는 함수형 프로그래밍 언어와 유사합니다.

구분된 유니언이 C#에서 오류 처리에 어떤 도움을 주나요?

구분된 유니언은 보다 정확한 타입 검사를 제공하고 패턴 매칭을 가능하게 하여 컴파일 시점에 잠재적인 오류를 잡아 수 있으므로, 응용 프로그램의 신뢰성을 향상시킬 수 있습니다.

제이콥 멜러, 팀 아이언 최고기술책임자
최고기술책임자

제이콥 멜러는 Iron Software의 최고 기술 책임자(CTO)이자 C# PDF 기술을 개척한 선구적인 엔지니어입니다. Iron Software의 핵심 코드베이스를 최초로 개발한 그는 창립 초기부터 회사의 제품 아키텍처를 설계해 왔으며, CEO인 캐머런 리밍턴과 함께 회사를 NASA, 테슬라, 그리고 전 세계 정부 기관에 서비스를 제공하는 50명 이상의 직원을 보유한 기업으로 성장시켰습니다.

제이콥은 맨체스터 대학교에서 토목공학 학사 학위(BEng)를 최우등으로 취득했습니다(1998~2001). 1999년 런던에서 첫 소프트웨어 회사를 설립하고 2005년 첫 .NET 컴포넌트를 개발한 후, 마이크로소프트 생태계 전반에 걸쳐 복잡한 문제를 해결하는 데 전문성을 발휘해 왔습니다.

그의 대표 제품인 IronPDF 및 Iron Suite .NET 라이브러리는 전 세계적으로 3천만 건 이상의 NuGet 설치 수를 기록했으며, 그의 핵심 코드는 전 세계 개발자들이 사용하는 다양한 도구에 지속적으로 활용되고 있습니다. 25년의 실무 경험과 41년의 코딩 전문성을 바탕으로, 제이콥은 차세대 기술 리더들을 양성하는 동시에 기업 수준의 C#, Java, Python PDF 기술 혁신을 주도하는 데 주력하고 있습니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해