IRONSOFTWAREHOME
개발자 업데이트

C# Vitrual Vs Abstract (개발자를 위한 작동 방식)

제이콥 멜러, 팀 아이언 최고기술책임자
Jacob Mellor
Updated: 2026년 4월 23일

C#에서는 가상 메서드가 파생 클래스에서 재정의될 수 있으며, 추상 메서드는 파생 클래스에서 반드시 재정의되어야 합니다. 이는 객체 지향 프로그래밍에서 유연한 동작을 가능하게 하고 다형성을 가능하게 합니다. 이 두 가지 개념은 객체 지향 프로그래밍에서 유연성과 재사용성을 제공합니다. 이 기사는 추상 및 가상 메서드의 구체적인 내용을 설명하고, 뚜렷한 예제와 함께 코딩에서의 실용적인 사용을 중심으로 설명합니다. 이 기사 후반에서는 IronPDF의 기능 및 사용 사례를 탐구할 것입니다.

추상 클래스 및 메서드

추상 클래스는 직접 인스턴스화할 수 없는 특별한 유형의 클래스입니다. 대신 다른 클래스의 청사진으로 사용됩니다. 추상 클래스는 추상 메서드를 포함할 수 있으며, 이들은 추상 클래스에서 선언되었지만 구체적인 파생 클래스에서 구현되어야 합니다.

public abstract class Vehicle
{
    // Abstract method to be implemented in non-abstract child class
    public abstract void DisplayInfo();
}

이 예에서 Vehicle 클래스는 추상 클래스로 DisplayInfo는 추상 메서드입니다. Vehicle 클래스에는 DisplayInfo 메서드의 구현이 없습니다. 이는 파생 클래스가 이 메서드에 대한 자체 정의를 제공하도록 강제합니다.

가상 메서드

가상 메서드는 기본 클래스에 기본 구현이 있는 메서드로, 파생 클래스에서 재정의할 수 있습니다. 가상 메서드를 선언하는 데는 virtual 키워드가 사용됩니다. 파생 클래스는 override 키워드를 사용하여 메서드의 특정 구현을 제공하며, 이는 자식 클래스가 부모 클래스의 가상 메서드를 어떻게 재정의할 수 있는지를 이해하는 데 도움이 됩니다.

// Non-abstract class
public class Animal
{
    // Virtual method with a default implementation
    public virtual void Speak()
    {
        Console.WriteLine("Some generic animal sound");
    }
}

여기서 Animal 클래스는 기본 구현이 있는 Speak 가상 메서드를 가지고 있습니다. 파생 클래스는 override 키워드를 사용하여 구체적인 동물 소리를 제공하기 위해 메서드를 재정의할 수 있습니다.

가상 메서드와 추상 메서드의 결합

클래스는 추상 메서드와 가상 메서드를 모두 포함할 수 있습니다. 추상 메서드는 구현을 가지고 있지 않으며 파생 클래스에서 재정의되어야 하지만, 가상 메서드는 기본 구현을 가지고 있으며 파생 클래스가 선택적으로 재정의할 수 있습니다.

각기 다른 방식으로 정보를 표시하는 차량 유형을 모델링하는 시스템을 구축하는 시나리오를 고려해보세요. 다음은 추상 및 가상 메서드를 사용하는 방법입니다:

public abstract class Vehicle
{
    // Abstract method
    public abstract void DisplayInfo();

    // Virtual method
    public virtual void StartEngine()
    {
        Console.WriteLine("Engine started with default configuration.");
    }
}

Vehicle 클래스에서 DisplayInfo는 모든 파생 클래스가 정보를 표시하는 자체 방법을 구현하도록 강제하는 추상 메서드입니다. 그러나 StartEngine은 기본적인 엔진 시작 방법을 제공하며, 필요에 따라 상속 클래스가 이를 재정의할 수 있습니다.

파생 클래스 예제

이제 Vehicle로부터 상속받아 추상 메서드를 구현하고 선택적으로 가상 메서드를 오버라이드하는 비추상 자식 클래스인 Car 클래스를 정의해 봅시다:

public class Car : Vehicle
{
    // Override the abstract method
    public override void DisplayInfo()
    {
        Console.WriteLine("This is a car.");
    }

    // Override the virtual method
    public override void StartEngine()
    {
        Console.WriteLine("Car engine started with custom settings.");
    }
}

여기에서 Car 클래스는 추상 메서드 DisplayInfo와 가상 메서드 StartEngine에 대한 구체적인 구현을 제공한다.

차이점과 사용 시기

  • 모든 파생된 클래스가 메서드의 자체 구현을 제공해야 할 때는 추상 메서드를 사용하십시오.
  • 파생된 클래스가 기본 값을 재정의하거나 추가적인 동작을 제공할 수 있는 경우 가상 메서드를 사용하십시오.

추상 및 가상 메서드는 유지 보수 및 코드 재사용성을 높일 수 있는 C#의 강력한 기능입니다. 기본 클래스에서 메서드를 추상 또는 가상으로 정의함으로써 파생 클래스에서 반드시 재정의해야 할 메서드와 기본 동작을 수정하거나 확장하기 위해 선택적으로 재정의할 수 있는 메서드를 결정할 수 있습니다.

가상 메서드 재정의

파생 클래스에서 가상 메서드를 재정의하면 기본 클래스 구현을 호출할 수 있는 선택권을 유지하면서 사용자 정의 동작을 허용합니다. 이는 base 키워드를 사용하여 달성됩니다.

기본 구현 재정의 및 호출 예제

public class ElectricCar : Car
{
    // Override the StartEngine method
    public override void StartEngine()
    {
        base.StartEngine(); // Call the base class implementation
        Console.WriteLine("Electric car engine started with energy-saving mode.");
    }
}

이 예시에서 Car의 자식 클래스인 ElectricCar는 부모 클래스에서 상속받은 StartEngine 메서드를 오버라이드합니다. 기본 클래스 구현을 호출하고 전기차에 특화된 추가 동작을 추가합니다.

추상 및 비추상 클래스 구현

소프트웨어 개발에서 추상 클래스와 비추상 클래스의 실질적인 차이점과 응용을 이해하는 것이 중요합니다. 추상 클래스는 다른 클래스의 템플릿 역할을 하며, 비추상 클래스는 객체 인스턴스화를 위해 사용됩니다. 추상 클래스와 비추상 클래스 중에서 선택하는 것은 자체로 인스턴스화할 수 없는 기본 클래스를 생성할 필요가 있는지 여부에 따라 달라집니다.

IronPDF: C# PDF 라이브러리

C# 가상 대 추상 (개발자를 위한 작동 방식): 그림 1 - IronPDF

IronPDF는 .NET 애플리케이션 내에서 PDF 문서를 직접 생성, 편집 및 읽기 위한 포괄적인 PDF 라이브러리입니다. 이 도구는 HTML 문자열, 파일 및 URL에서 직접 PDF를 생성하는 기능으로 눈에 띕니다. 개발자는 C# 프로젝트에서 프로그래밍 방식으로 PDF 콘텐츠를 생성, 수정 및 추출할 수 있습니다. 우리 기사에서 IronPDF의 예를 탐구해봅시다.

IronPDF의 주요 기능은 HTML을 PDF로 변환하여 레이아웃과 스타일이 유지되는 것입니다. 이 도구는 보고서, 인보이스 및 문서화를 위한 웹 콘텐츠에서 PDF를 생성하는 데 훌륭합니다. HTML 파일, URL 및 HTML 문자열을 PDF 파일로 변환하는 것을 지원합니다.

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");
        
        // Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");
        
        // Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}

코드 예제

IronPDF 기능 확장의 맥락에서 virtualabstract 키워드를 사용하는 방법을 설명하는 직관적인 실제 코드 예제가 있습니다.

public abstract class PdfReportGenerator
{
    // Use abstract method to force derived classes to implement their custom PDF generation logic
    public abstract void GenerateReport(string filePath);

    // A virtual function allows derived classes to override the default implementation of PDF setup
    public virtual void SetupPdfGenerator()
    {
        // Default PDF setup logic that can be overridden by derived classes
        IronPdf.Installation.TempFolderPath = @"F:\TempPdfFiles";
    }
}

public class MonthlyReportGenerator : PdfReportGenerator
{
    // Override abstract method to provide specific implementation
    public override void GenerateReport(string filePath)
    {
        var pdf = new ChromePdfRenderer();
        pdf.RenderHtmlAsPdf("<h1>Monthly Report</h1> <p>Add Your report content here....</p>").SaveAs(filePath);
    }

    // Optionally override the virtual method to customize the setup
    public override void SetupPdfGenerator()
    {
        base.SetupPdfGenerator();
        // Additional setup logic specific to monthly reports
        IronPdf.Installation.TempFolderPath = @"F:\MonthlyReports";
    }
}

class Program
{
    static void Main(string[] args)
    {
        License.LicenseKey = "License-Key";
        PdfReportGenerator reportGenerator = new MonthlyReportGenerator();
        reportGenerator.SetupPdfGenerator();
        reportGenerator.GenerateReport(@"F:\MonthlyReports\MonthlyReport.pdf");
        Console.WriteLine("Report generated successfully.");
    }
}

이 사용자 정의 구현 예제에서 PdfReportGenerator는 리포트를 생성하는 메서드와 선택적으로 재정의 가능한 가상 설정 메서드를 통해 PDF 보고서를 생성하는 계약을 정의하는 추상 클래스입니다. MonthlyReportGenerator는 월간 보고서를 생성하는 구체적 구현을 제공하며 가상 메서드를 재정의하여 설정을 사용자 정의합니다.

C# 가상 대 추상 (개발자를 위한 작동 방식): 그림 2 - 보고서 출력

결론

가상 및 추상 메서드를 효과적으로 이해하고 사용하는 것은 C# 프로그래밍을 크게 향상시킬 수 있습니다. 기억하세요, 추상 메서드는 파생 클래스가 구현을 제공해야 하고, 가상 메서드는 기본 구현을 선택적으로 재정의할 수 있게 합니다. IronPDF 라이브러리는 귀하의 PDF 요구 사항에 대한 포괄적인 솔루션을 제공하며, 라이선스는 $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일 무료 체험판 키를 받으세요.
신용카드나 계정 생성은 필요하지 않습니다.