IRONSOFTWAREHOME
개발자 업데이트

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

제이콥 멜러, 팀 아이언 최고기술책임자
Jacob Mellor
Updated: 2025년 7월 28일

분류된 유니온은 태그가 있는 유니온 또는 합집합 유형으로도 알려져 있으며, 서로 다른 형태를 가질 수 있는 데이터를 모델링하는 강력한 도구를 나타냅니다. 하지만 가능한 경우는 잘 정의되어 있고 제한되어 있습니다. C#은 다른 언어들처럼 (예: F# 또는 Rust) 기본적으로 분류된 유니온을 지원하지 않지만, 언어 내의 여러 기술을 사용하여 분류된 유니온을 시뮬레이션할 수 있습니다. 이 튜토리얼에서는 분류된 유니온, C#에서 이를 구현하는 방법 및 IronPDF 라이브러리와의 실제 사용 사례를 다룰 것입니다.

분류된 유니온이란 무엇인가요?

간단히 말해, 분류된 유니온은 여러 사전 정의된 형태 또는 값을 가질 수 있는 유형입니다. 컴파일 타임에 유효한 경우만 처리된다는 것을 보장하면서 서로 다른 유형 또는 값을 캡슐화하는 타입 안전 구조를 만들 수 있는 방법을 제공합니다.

작업의 결과를 나타내려고 하는 시나리오를 상상해 보세요. 이 작업은 성공적으로 수행되어 일부 데이터를 반환하거나 실패하여 오류 메시지를 반환할 수 있습니다. 분류된 유니온은 이러한 두 가지 가능한 결과를 단일 유형으로 나타낼 수 있습니다.

Example: Simulating Discriminated Union in C#

다음은 클래스 구조를 사용하여 C#에서 분류된 유니온을 어떻게 시뮬레이트할 수 있는지에 대한 예제입니다:

// Define an abstract base class representing the operation result.
public abstract class OperationResult<t>
{
    // Private constructor to ensure the class cannot be instantiated directly.
    private OperationResult() { }

    // Nested class representing a successful operation result.
    public sealed class Success : OperationResult<t>
    {
        public T Value { get; }
        
        public Success(T value) => Value = value;

        public override string ToString() => $"Success: {Value}";
    }

    // Nested class representing a failed operation result.
    public sealed class Failure : OperationResult<t>
    {
        public string Error { get; }
        
        public Failure(string error) => Error = error;

        public override string ToString() => $"Failure: {Error}";
    }

    // Factory method to create a successful operation result.
    public static OperationResult<t> CreateSuccess(T value) => new Success(value);

    // Factory method to create a failed operation result.
    public static OperationResult<t> CreateFailure(string error) => new Failure(error);
}
C#

이 예에서, OperationResult<t>는 우리 판별된 유니온 타입을 나타내는 추상 클래스입니다. 이는 T 타입의 값을 가진 Success 또는 오류 메시지를 가진 Failure일 수 있습니다. 비공개 생성자는 이러한 클래스의 인스턴스가 사전 정의된 경우를 통해서만 생성될 수 있도록 보장합니다.

분류된 유니온과 패턴 매칭 사용

C#은 분류된 유니온과 잘 작동하는 강력한 패턴 매칭 기능을 제공합니다. 스위치 표현식을 사용하여 다른 사례를 처리하는 메서드로 OperationResult<t> 예제를 확장해봅시다.

// Method to handle the result using pattern matching.
public string HandleResult(OperationResult<int> result) =>
    result switch
    {
        OperationResult<int>.Success success => $"Operation succeeded with value: {success.Value}",
        OperationResult<int>.Failure failure => $"Operation failed with error: {failure.Error}",
        _ => throw new InvalidOperationException("Unexpected result type")
    };

여기 스위치 표현식은 OperationResult<int>SuccessFailure 사례를 모두 처리합니다. 이는 컴파일 타임에 모든 가능한 케이스가 커버됨을 보장하며, 이는 타입 안전성을 제공하고 런타임 오류의 위험을 줄여줍니다.

분류된 유니온을 위한 확장 메서드

확장 메서드를 사용하여 분류된 유니온의 기능을 확장할 수 있습니다. 예를 들어, 결과가 성공인지 결정하기 위해 OperationResult<t>에 대한 확장 메서드를 만들어봅시다.

// Static class to hold extension methods for OperationResult<t>.
public static class OperationResultExtensions
{
    // Extension method to check if the operation result indicates success. 
    public static bool IsSuccess<t>(this OperationResult<t> result) =>
        result is OperationResult<t>.Success;
}

이 정적 메서드는 결과가 Success 사례의 인스턴스인지 확인합니다.

Native Support for Discriminated Unions in C#

C#은 다른 언어들처럼 기본적으로 분류된 유니온을 지원하지 않지만, 이러한 기능 추가에 대한 커뮤니티 내의 지속적인 논의가 있습니다. 기본적인 분류된 유니온은 클래스 계층구조에 의존하지 않고 유니온 유형을 정의하고 작업하는 것을 더 쉽게 만들 것입니다.

컴파일러 오류 및 타입 안전성

분류된 유니온의 주요 이점 중 하나는 제공되는 타입 안전성입니다. 모든 가능한 케이스를 컴파일 타임에 알고 있으므로, 컴파일러는 모든 경우가 처리되도록 강제할 수 있습니다. 이로 인해 런타임 오류가 줄어들고 코드가 오류에 덜 취약해집니다.

예를 들어, switch문의 특정 케이스를 처리하는 것을 잊으면, 컴파일러는 오류를 발생시켜 누락된 케이스를 처리하도록 유도합니다. 이는 여러 가지 가능한 케이스가 있는 복잡한 데이터 구조를 다룰 때 특히 유용합니다.

Using IronPDF with Discriminated Unions in C#

C# 판별된 유니온 (개발자를 위한 작동 방식): 그림 1 - IronPDF

IronPDF는 개발자가 HTML에서 PDF 파일을 생성하고 아무런 문제 없이 PDF 파일을 수정할 수 있도록 도와주는 C# PDF 라이브러리입니다. C#에서 PDF 작업을 할 때, IronPDF를 차별화된 합집합과 통합하여 PDF 파일을 생성하거나 처리할 때 다양한 시나리오를 처리할 수 있습니다. 예를 들어, PDF 생성에 성공하거나 오류가 발생하는 프로세스가 있을 수 있습니다. 차별화된 합집합을 사용하면 이 프로세스를 명확하게 모델링할 수 있습니다. IronPDF를 사용하여 PDF를 생성하고, 그 결과를 차별화된 합집합으로 반환하는 간단한 예제를 만들어봅시다.

// Using directives for necessary namespaces.
using IronPdf;
using System;

// Define an abstract base class representing the PDF generation result.
public abstract class PdfResult
{
    // Private constructor to ensure the class cannot be instantiated directly.
    private PdfResult() { }

    // Nested class representing a successful PDF generation result.
    public sealed class Success : PdfResult
    {
        public PdfDocument Pdf { get; }
        
        public Success(PdfDocument pdf) => Pdf = pdf;

        public override string ToString() => "PDF generation succeeded";
    }

    // Nested class representing a failed PDF generation result.
    public sealed class Failure : PdfResult
    {
        public string ErrorMessage { get; }
        
        public Failure(string errorMessage) => ErrorMessage = errorMessage;

        public override string ToString() => $"PDF generation failed: {ErrorMessage}";
    }

    // Factory method to create a successful PDF result.
    public static PdfResult CreateSuccess(PdfDocument pdf) => new Success(pdf);

    // Factory method to create a failed PDF result.
    public static PdfResult CreateFailure(string errorMessage) => new Failure(errorMessage);
}

// Class to generate PDFs using IronPDF.
public class PdfGenerator
{
    // Method to generate a PDF from HTML content and return the result as a PdfResult.
    public PdfResult GeneratePdf(string htmlContent)
    {
        try
        {
            // Create a new ChromePdfRenderer instance.
            var renderer = new ChromePdfRenderer();

            // Attempt to render the HTML content as a PDF.
            var pdf = renderer.RenderHtmlAsPdf(htmlContent);

            // Return a success result with the generated PDF.
            return PdfResult.CreateSuccess(pdf);
        }
        catch (Exception ex)
        {
            // Return a failure result with the error message if an exception occurs.
            return PdfResult.CreateFailure(ex.Message);
        }
    }
}

PdfResult 클래스는 두 가지 사례가 있는 판별된 유니온을 나타냅니다: SuccessFailure. Success 사례는 PdfDocument을 포함하고, Failure 사례는 오류 메시지를 보유합니다. GeneratePdf 메서드는 HTML 문자열을 받아 IronPDF를 사용하여 PDF 생성을 시도하고 결과를 PdfResult로 반환합니다. PDF 생성이 성공하면 생성된 PDF와 함께 Success 사례를 반환합니다. 예외가 발생하면 오류 메시지와 함께 Failure 사례를 반환합니다.

결론

C# 판별된 유니온 (개발자를 위한 작동 방식): 그림 2 - 라이선싱

C#의 차별화된 합집합은 여러 가지 가능한 케이스의 데이터를 모델링하는 강력하고 유연한 방법을 제공합니다. C#은 차별화된 합집합을 지원하지 않지만, 클래스 계층, 패턴 매칭 및 기타 기술을 사용하여 이를 시뮬레이션할 수 있습니다. 결과적으로 코드가 타입 안전성이 높아지고 오류가 적어지며 유지 보수가 용이해집니다.

IronPDF는 사전 비용 없이 소프트웨어를 체험할 수 있는 무료 체험판을 제공합니다. 모든 기능을 탐험하고 자신의 요구와 어떻게 맞는지 확인할 수 있습니다. 체험판 후에, 라이선스는 $999부터 시작됩니다.

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

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

...
더 읽어보기

관련 기사

Key in blue circle

무료 30일 체험 키를 즉시 받으세요.

Your trial license will be sent to your email address

제한 없음. 100% 무제한 이용. 신용카드 불필요.

bullet_checked신용카드나 계정 생성은 필요하지 않습니다.제한 없음. 100% 무제한 이용. 신용카드 불필요.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
무료 라이브 데모를 예약하세요
Booking Badge

전 세계 수백만 엔지니어들이 신뢰하는 제품입니다.

Iron Software의 고객 로고
부담 없는 무료 상담을 받아보세요
아래 양식을 작성하시거나 sales@ironsoftware.com으로 이메일을 보내주세요.
고객님의 정보는 항상 비밀로 유지됩니다.
전 세계 수백만 엔지니어들이 신뢰하는 제품입니다.
Iron Software의 고객 로고
지금 바로 30일 무료 체험판 키를 받으세요.
신용카드나 계정 생성은 필요하지 않습니다.