C# Record Vs Class (개발자를 위한 작동 방식)
C#의 세계에서 데이터 모델링과 캡슐화를 위해 주로 사용하는 두 가지 구조는 클래스와 레코드입니다. 둘 다 참조 타입으로서의 역할을 하지만, 의도된 사용, 동작 및 평등성을 처리하는 방식에서 상당히 다릅니다. 이번 가이드는 이러한 차이점을 분석하고, 개발자가 필요에 맞는 구조를 선택하기 위한 명확한 예와 실용적인 사용 방법을 제공합니다. IronPDF 라이브러리에 대해서도 배웁니다.
C#의 클래스: 기초
클래스는 C#의 객체 지향 프로그래밍의 중심으로, 데이터와 행동을 캡슐화하기 위해 설계되었습니다. 참조 타입으로서, 값이 동일한 두 클래스 인스턴스는 두 개의 별도 객체로 간주됩니다. 이는 두 클래스 인스턴스를 비교할 때 중요합니다; 기본 비교는 값 기반이 아니라 참조 기반입니다.
public class Person
{
public int Id { get; set; }
public string FullName { get; set; }
}
public class Person
{
public int Id { get; set; }
public string FullName { get; set; }
}
Public Class Person
Public Property Id() As Integer
Public Property FullName() As String
End Class
위의 예에서, Person은 Id와 FullName 속성을 가진 클래스입니다. 심지어 두 Person 인스턴스가 동일한 Id와 FullName 값을 가지고 있다 하더라도, 메모리의 두 다른 참조이기 때문에 기본적으로 같은 것으로 간주되지 않습니다.
C#의 레코드: 불변 데이터 구조
C#에 도입된 레코드 타입은 불변 데이터 구조의 생성을 간소화하기 위한 새 강조 표상으로, 전통적인 클래스 구조에 대한 강력한 대안을 제공합니다. 클래스와 달리, 레코드는 값 기반의 평등성을 제공하여 데이터 전송 객체나 적거나 없는 행동을 가진 작은 데이터 구조에 이상적입니다.
public record Person(int Id, string FullName);
public record Person(int Id, string FullName);
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Person(int Id, string FullName)
위 예에서, 레코드 정의는 보일러플레이트 코드를 줄여 더 간결합니다. 레코드는 자동으로 비파괴적 변형과 값 기반 비교를 지원합니다. 동일한 값을 가진 두 레코드 인스턴스는 값 기반 의미와 맞아떨어지며 동일한 것으로 간주됩니다.
실용적 사용: 클래스 대 레코드를 사용할 때
C#에서의 클래스와 레코드, 또는 다른 데이터 구조를 선택하는 것은 모델링하려는 데이터의 복잡성 및 여러분의 애플리케이션에서 요구하는 행동에 달려 있습니다. 클래스는 복합 데이터 구조를 위해 설계되어 있으며, 행동(메서드)이 가능하고 필요에 따라 수정 가능한 인스턴스를 허용합니다. 반면에, 레코드는 간단한 데이터 구조의 완벽한 예로, 불변 특성과 값 기반 평등성으로 설계되어, 생성 후 불변인 데이터에 이상적입니다.
클래스는 데이터 구조가 데이터를 캡슐화하는 것과 행동을 요구하거나 생성 후 데이터를 조작해야 할 때 이상적입니다. 이 유연성은 대부분의 전통적 객체 지향 프로그래밍 시나리오와 복합 데이터 구조 생성 시에 클래스를 주요 선택으로 만듭니다.
레코드는 데이터 불변성이 중요한 경우나 주로 데이터 컨테이너로 작동하는 간단한 데이터 구조를 다루는 경우에 빛을 발합니다. 레코드의 내장된 값 기반 평등성과 간결한 구문은 데이터 전송 객체나 값 객체에 대해 우수합니다.
값 타입과 참조 타입
C#에서 값 타입과 참조 타입의 차이를 이해하는 것은 중요합니다. 클래스는 참조 타입으로, 변수가 메모리에 있는 실제 데이터에 대한 참조를 보유합니다. 이 특성은 기본 참조 기반 평등 비교로 이어집니다.
레코드는 참조 타입이기도 하지만, 내장된 값 기반 평등을 통해 값 구문을 모방하여 비교에서 값 타입처럼 행동하게 합니다.
코드 예: 클래스와 레코드 구현하기
클래스와 레코드를 구현하여 문법 및 동작의 차이를 강조해 봅시다.
클래스 구현:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public Product(int id, string name)
{
Id = id;
Name = name;
}
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public Product(int id, string name)
{
Id = id;
Name = name;
}
}
Public Class Product
Public Property Id() As Integer
Public Property Name() As String
Public Sub New(ByVal id As Integer, ByVal name As String)
Me.Id = id
Me.Name = name
End Sub
End Class
레코드 구현:
public record Product(int Id, string Name);
public record Product(int Id, string Name);
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Product(int Id, string Name)
레코드 구현의 간결함과 단순함을 주목하십시오. 레코드는 생성자, 속성 및 값 기반 동등성을 위한 메서드를 자동으로 생성합니다.
동등성 이해: 참조 vs 값
C#에서 클래스와 레코드 유형 간의 핵심 차이점은 실제로 동등성을 처리하는 방법에 있습니다:
-
클래스는 기본적으로 참조 동등성을 사용하여 두 인스턴스가 동일한 메모리 위치를 가리키면 동등하다고 간주합니다.
- 레코드는 기본적으로 값 동등성을 사용하여 속성이 같은 값을 가지면 두 인스턴스가 동등하다고 간주합니다.
참조 동등성 예제 (클래스)
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
var classInstance1 = new Person { Id = 1, Name = "Iron Software" };
var classInstance2 = new Person { Id = 1, Name = "Iron Software" };
Console.WriteLine(classInstance1 == classInstance2); // Outputs: False
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
var classInstance1 = new Person { Id = 1, Name = "Iron Software" };
var classInstance2 = new Person { Id = 1, Name = "Iron Software" };
Console.WriteLine(classInstance1 == classInstance2); // Outputs: False
Public Class Person
Public Property Id() As Integer
Public Property Name() As String
End Class
Private classInstance1 = New Person With {
.Id = 1,
.Name = "Iron Software"
}
Private classInstance2 = New Person With {
.Id = 1,
.Name = "Iron Software"
}
Console.WriteLine(classInstance1 = classInstance2) ' Outputs: False
동일한 속성 값을 가진 클래스의 두 인스턴스는 메모리에서 다른 객체이기 때문에 동등하지 않다고 간주됩니다.
값 동등성 예제
public record Person(int Id, string Name);
var recordInstance1 = new Person(1, "Iron Software");
var recordInstance2 = new Person(1, "Iron Software");
Console.WriteLine(recordInstance1 == recordInstance2); // Outputs: True
public record Person(int Id, string Name);
var recordInstance1 = new Person(1, "Iron Software");
var recordInstance2 = new Person(1, "Iron Software");
Console.WriteLine(recordInstance1 == recordInstance2); // Outputs: True
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Person(int Id, string Name)
Private recordInstance1 = New Person(1, "Iron Software")
Private recordInstance2 = New Person(1, "Iron Software")
Console.WriteLine(recordInstance1 = recordInstance2) ' Outputs: True
동일한 속성 값을 가진 레코드의 두 인스턴스는 기본적으로 동등하다고 간주됩니다.
고급 기능: 레코드
레코드는 불변 데이터 구조와 값 기반 동등성 요구에 부응하는 여러 고급 기능을 제공합니다. with 표현식을 사용하면 기존 레코드를 복사하고 일부 속성을 수정하여 새로운 레코드 인스턴스를 생성할 수 있어 비파괴적 변화를 보여줍니다.
레코드의 비파괴적 변형:
var originalRecord = new Person(1, "Doe");
var modifiedRecord = originalRecord with { Name = "Iron Developer" };
var originalRecord = new Person(1, "Doe");
var modifiedRecord = originalRecord with { Name = "Iron Developer" };
Dim originalRecord = New Person(1, "Doe")
'INSTANT VB TODO TASK: C# 'with expressions' are not converted by Instant VB:
'var modifiedRecord = originalRecord with { Name = "Iron Developer" }
이 기능은 불변 데이터 구조 작업 시 유용하며 원본 데이터를 변경하지 않고 인스턴스를 "수정"할 수 있는 방법을 제공합니다.
IronPDF 라이브러리 소개

IronPDF는 .NET 개발자를 위한 PDF 라이브러리로, PDF 문서를 생성, 편집 및 관리하기 위한 포괄적인 솔루션을 제공합니다. 개발자가 HTML을 PDF로 변환, CSS, JavaScript 및 이미지를 PDF로 변환할 수 있도록 하여 PDF 생성 프로세스를 간소화합니다. IronPDF는 웹, 데스크톱, 콘솔 애플리케이션을 포함하여 다양한 .NET Framework 및 프로젝트 유형을 지원하며, Windows, Linux, macOS 등의 여러 운영 체제에서 사용할 수 있습니다.
PDF 생성 외에도 IronPDF는 PDF 편집, 속성과 보안 설정, PDF 폼 작업 및 콘텐츠 추출 기능을 제공합니다. 이는 .NET 프로젝트에 PDF 기능을 통합하려는 개발자에게 신뢰할 수 있는 도구를 제공하기 위해 설계되었습니다.
코드 예제
C#에서 IronPDF를 사용하여 PDF를 생성하는 것은 클래스와 레코드 둘 다를 사용하여 가능합니다. 아래에는 간단한 PDF 문서를 생성하기 위한 두 가지 접근 방식의 예시가 있습니다. C#에서 클래스와 레코드의 주요 차이점은 의도된 사용에 있으며, 클래스는 기본적으로 변경 가능하고 전통적인 객체 지향 프로그래밍을 위해 설계된 반면, 레코드는 불변이며 값 기반 프로그래밍을 위해 설계되어 데이터 모델링에 이상적입니다.
클래스 사용하기
이 예제에서는 주어진 HTML 문자열에서 PDF를 생성하는 메서드를 포함하는 PdfGenerator 클래스를 정의할 것입니다.
using IronPdf;
using System;
public class PdfGenerator
{
public string HtmlContent { get; set; }
public PdfGenerator(string htmlContent)
{
HtmlContent = htmlContent;
}
public void GeneratePdf(string filePath)
{
var renderer = new ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent);
pdfDocument.SaveAs(filePath);
}
}
class Program
{
public static void Main(string[] args)
{
License.LicenseKey = "License-Key"; // Set your license key here
var generator = new PdfGenerator("<h1>Hello, World from Class!</h1>");
generator.GeneratePdf("ClassExample.pdf");
}
}
using IronPdf;
using System;
public class PdfGenerator
{
public string HtmlContent { get; set; }
public PdfGenerator(string htmlContent)
{
HtmlContent = htmlContent;
}
public void GeneratePdf(string filePath)
{
var renderer = new ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent);
pdfDocument.SaveAs(filePath);
}
}
class Program
{
public static void Main(string[] args)
{
License.LicenseKey = "License-Key"; // Set your license key here
var generator = new PdfGenerator("<h1>Hello, World from Class!</h1>");
generator.GeneratePdf("ClassExample.pdf");
}
}
Imports IronPdf
Imports System
Public Class PdfGenerator
Public Property HtmlContent() As String
Public Sub New(ByVal htmlContent As String)
Me.HtmlContent = htmlContent
End Sub
Public Sub GeneratePdf(ByVal filePath As String)
Dim renderer = New ChromePdfRenderer()
Dim pdfDocument = renderer.RenderHtmlAsPdf(HtmlContent)
pdfDocument.SaveAs(filePath)
End Sub
End Class
Friend Class Program
Public Shared Sub Main(ByVal args() As String)
License.LicenseKey = "License-Key" ' Set your license key here
Dim generator = New PdfGenerator("<h1>Hello, World from Class!</h1>")
generator.GeneratePdf("ClassExample.pdf")
End Sub
End Class
출력:

레코드 사용하기
반대로, C#에서 레코드는 초기화 이후 수정할 수 없습니다. 레코드로 비슷한 결과를 달성하는 방법은 with 표현식을 활용하여 수정하는 것입니다. 본질적으로 원하는 변경 사항을 반영하는 새 레코드 인스턴스를 반환합니다.
using IronPdf;
using System;
public record PdfGeneratorRecord(string HtmlContent)
{
public void GeneratePdf(string filePath)
{
var renderer = new ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(this.HtmlContent);
pdfDocument.SaveAs(filePath);
}
}
class Program
{
public static void Main(string[] args)
{
License.LicenseKey = "License-Key"; // Set your license key here
var recordGenerator = new PdfGeneratorRecord("<h1>Hello, World from Record!</h1>");
recordGenerator.GeneratePdf("RecordExample.pdf");
}
}
using IronPdf;
using System;
public record PdfGeneratorRecord(string HtmlContent)
{
public void GeneratePdf(string filePath)
{
var renderer = new ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(this.HtmlContent);
pdfDocument.SaveAs(filePath);
}
}
class Program
{
public static void Main(string[] args)
{
License.LicenseKey = "License-Key"; // Set your license key here
var recordGenerator = new PdfGeneratorRecord("<h1>Hello, World from Record!</h1>");
recordGenerator.GeneratePdf("RecordExample.pdf");
}
}
Imports IronPdf
Imports System
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record PdfGeneratorRecord(string HtmlContent)
'{
' public void GeneratePdf(string filePath)
' {
' var renderer = New ChromePdfRenderer();
' var pdfDocument = renderer.RenderHtmlAsPdf(Me.HtmlContent);
' pdfDocument.SaveAs(filePath);
' }
'}
Friend Class Program
Public Shared Sub Main(ByVal args() As String)
License.LicenseKey = "License-Key" ' Set your license key here
Dim recordGenerator = New PdfGeneratorRecord("<h1>Hello, World from Record!</h1>")
recordGenerator.GeneratePdf("RecordExample.pdf")
End Sub
End Class
출력:

이 예제들은 클래스와 레코드를 사용하여 IronPDF로 PDF 파일을 생성하는 방법을 보여줍니다. 클래스나 레코드를 사용하는 선택은 필요에 따라 달라집니다: 생성 후 수정할 객체가 필요하면 클래스가 더 적절할 수 있습니다. 한 번 생성된 이후에 변경되지 않는 데이터나, 불변성의 구문적 단순성과 안전성을 선호하는 경우 레코드가 더 나은 선택일 수 있습니다.
결론

결론적으로, 클래스는 변경 가능한 상태와 참조 기반 동등성을 가진 전통적인 객체 지향 기능을 제공하며, 레코드는 불변 데이터 구조와 값 기반 동등성을 정의하는 현대적인 접근 방식을 제공합니다.
클래스나 레코드를 사용하는 선택은 애플리케이션의 특정 요구 사항에 의해 좌우되어야 하며, 불변성의 필요성, 데이터 구조의 복잡성, 선호하는 동등성 비교 방법과 같은 요소를 고려해야 합니다. IronPDF의 무료 체험판을 발견하세요 .NET 애플리케이션에 PDF 기능을 통합하고자 하는 분들을 위한 것으로, 라이선스는 $799에서 시작합니다.
자주 묻는 질문
C# 클래스와 레코드의 주요 차이점은 무엇입니까?
C# 클래스와 레코드는 모두 참조 유형이고 데이터를 모델링하고 캡슐화하기 위해 사용되지만, 그들이 동등성과 불변성을 처리하는 방식이 다릅니다. 클래스는 참조 동등성을 사용하여, 두 인스턴스가 동일한 메모리 위치를 가리키면 동등하다고 간주합니다. 반면, 레코드는 값 기반 동등성을 사용하여, 속성 값이 동일하면 두 인스턴스를 동등하다고 간주하며, 기본적으로 불변으로 설계되었습니다.
C#에서 클래스를 사용할지 레코드를 사용할지 결정하는 방법은?
C#에서 클래스와 레코드 중 어떤 것을 사용할지는 특정 요구 사항에 따라 다릅니다. 변경 가능한 인스턴스가 필요하거나 객체 지향 프로그래밍에서 일반적인 데이터와 동작을 캡슐화하는 경우 클래스 사용을 고려하세요. 구조가 간단하고 불변이며 값 기반 동등성이 필요한 경우, 예를 들어 데이터 전송 객체에서는 레코드를 선택하세요.
IronPDF 라이브러리가 .NET에서 PDF 생성에 어떻게 지원을 주나요?
IronPDF는 .NET을 위한 강력한 PDF 라이브러리로, PDF 문서의 생성, 편집 및 관리를 단순화합니다. 개발자는 HTML, CSS, JavaScript 및 이미지를 PDF로 변환할 수 있으며, 다양한 .NET Framework 및 운영 체제를 지원하여 .NET 개발자에게 필수 도구입니다.
PDF 생성 프로젝트에서 C# 클래스와 레코드를 모두 사용할 수 있습니까?
네, PDF 생성 프로젝트에서 C# 클래스와 레코드를 모두 사용할 수 있습니다. 선택은 논리에 대해 변경 가능한 데이터 구조가 필요한지 불변성 데이터 구조가 필요한지에 따라 달라집니다. 예를 들어, IronPDF는 이들 구조 중 어느 것을 사용하든 함께 작동하여 PDF를 생성 및 조작할 수 있습니다.
C# 레코드에서 불변성이 어떤 역할을 하나요?
불변성은 C# 레코드의 핵심 기능입니다. 한번 생성되면 레코드의 속성을 변경할 수 없으며, 이는 값 기반 동등성 의미론과 일치합니다. 이러한 설계는 데이터 일관성과 무결성이 중요한 데이터 전송 객체 시나리오에 이상적입니다.
IronPDF는 .NET 애플리케이션을 위한 PDF 기능을 어떻게 강화합니까?
IronPDF는 HTML을 PDF로 변환, PDF 편집 및 문서 보안 관리와 같은 기능을 제공함으로써 .NET 애플리케이션을 위한 PDF 기능을 강화합니다. 양식 작업, 콘텐츠 추출 및 다양한 .NET 환경 간의 매끄러운 통합을 지원하여 PDF 문서 처리를 간소화합니다.
C# 레코드 맥락에서 'with' 표현은 무엇입니까?
'with' 표현은 C# 레코드에서 비파괴적 변이를 위해 사용됩니다. 이는 개발자가 기존 레코드를 복사하면서 일부 속성을 수정한 새 레코드 인스턴스를 생성할 수 있게 하여, 원래 데이터는 변경되지 않도록 합니다.
레코드는 왜 데이터 전송 객체에 적합한가요?
레코드는 불변 구조를 값 기반 동등성과 함께 정의하는 간결한 구문을 제공하여 데이터 전송 객체에 적합합니다. 이는 데이터 무결성을 유지하고 동일한 값의 인스턴스를 동등하게 취급하므로, 데이터 전송 시나리오에서 종종 바람직합니다.




