
C# Init 키워드 (개발자를 위한 작동 방식)
C# 9.0의 init 키워드는 불변 객체 생성에 대한 클래스 속성을 정의하는 새로운 방법을 도입했습니다. 이전의 C# 버전에서는, 속성은 일반적으로 get 및 set 접근자로 객체 필드를 읽고 쓸 수 있도록 사용되었습니다. 그러나 init을 사용하면 객체 초기화 동안에만 쓸 수 있는 속성을 만들어 이후에는 읽기 전용으로 유지할 수 있습니다.
이 튜토리얼에서는 실용적인 예제와 시나리오를 통해 IronPDF 라이브러리와 함께 C# init 키워드를 사용하는 방법을 탐색할 것입니다. 전통적인 속성 설정자(set)와 새로운 init 전용 설정자 사이의 중요한 차이점도 배우게 됩니다.
Init 키워드의 기본 예제
기본 예제부터 시작해 봅시다:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
var person = new Person
{
FirstName = "Iron",
LastName = "Dev"
};
// person.FirstName = "Jane"; // This will give a compile-time error.Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
End Class
Private person = New Person With {
.FirstName = "Iron",
.LastName = "Dev"
}
' person.FirstName = "Jane"; // This will give a compile-time error.
이 예제에서는 FirstName와 LastName가 init-only 속성으로 표시됩니다. 이는 객체 초기화 중에만 할당될 수 있음을 의미합니다. 객체가 생성된 후 값을 변경하려고 하면 컴파일 타임 오류가 발생합니다.
Init 키워드를 사용하는 이유
init 키워드를 사용하는 주요 이유는 객체 속성을 초기화 후 불변으로 만드는 것입니다. 전통적으로 불변성을 달성하기 위해 속성을 읽기 전용으로 설정할 수 있었습니다. 하지만 필요한 값을 모두 수용하는 생성자가 필요했으며, 이는 종종 생성자 보일러플레이트 코드를 초래할 수 있습니다. init을 사용하면 긴 생성자 없이 객체 초기자를 사용하여 동일한 목표를 달성할 수 있습니다.
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
// Without using constructor boilerplate for property initialization
}
var person = new Person
{
FirstName = "John",
LastName = "Doe"
};Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
' Without using constructor boilerplate for property initialization
End Class
Private person = New Person With {
.FirstName = "John",
.LastName = "Doe"
}Init-Only 속성을 사용한 객체 초기화
init을 사용하면 객체 초기자와 원활하게 작동합니다. 값을 설정하기 위해 생성자에 의존하는 대신, 객체를 생성하는 동안 필요한 속성을 직접 정의할 수 있습니다.
public class Point
{
public int X { get; init; }
public int Y { get; init; }
}
var point = new Point { X = 10, Y = 20 };
// point.X = 30; // This will throw a compile-time errorPublic Class Point
Public Property X() As Integer
Public Property Y() As Integer
End Class
Private point = New Point With {
.X = 10,
.Y = 20
}
' point.X = 30; // This will throw a compile-time error이는 Point 유형의 간단하고 불변 객체를 생성합니다. 초기화 시 X 및 Y의 값이 설정되며 나중에 수정할 수 없습니다.
생성자와 init 혼합 사용하기
init의 주요 사용 사례는 객체 이니셜라이저를 통한 객체 초기화이지만, 필요하다면 여전히 생성자를 사용할 수 있습니다. 이는 객체 생성 시 특정 속성 값을 강제할 때 특히 유용합니다.
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.FirstName = firstName
Me.LastName = lastName
End Sub
End Class생성자와 init 속성을 함께 사용할 수 있습니다. 이 접근법은 개체 구축 후 불변성을 유지하면서도 더 큰 유연성을 제공합니다.
Init이 Private Set보다 가지는 이점
이전에는 개발자들이 클래스 외부에서 속성 수정 제한을 위해 private set 접근자를 사용했습니다.
public class Person
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}Public Class Person
Private privateFirstName As String
Public Property FirstName() As String
Get
Return privateFirstName
End Get
Private Set(ByVal value As String)
privateFirstName = value
End Set
End Property
Private privateLastName As String
Public Property LastName() As String
Get
Return privateLastName
End Get
Private Set(ByVal value As String)
privateLastName = value
End Set
End Property
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.FirstName = firstName
Me.LastName = lastName
End Sub
End Class이 접근법은 작동하지만 속성을 초기화하기 위한 생성자 반복 코드가 필요합니다. 또한 클래스 자체가 나중에 속성을 수정할 수 있으며, 이는 불변 객체에 대해 항상 이상적인 것은 아닙니다. init 키워드는 객체 생성 시 초기화만 허용하고 이후 수정은 차단하므로 이 문제를 해결합니다.
읽기 전용 필드 및 Init 접근자로 초기화 처리
init 키워드는 객체 생성 중 필드나 속성을 초기화한 후 여전히 불변으로 유지할 수 있습니다. 읽기 전용 필드는 불변성을 제공하는 반면, init 접근자는 속성에 대해 유사한 기능을 제공합니다. 다음은 두 가지 방법으로 불변성을 처리하는 방법입니다: 읽기 전용 필드와 init 속성을 사용하여.
생성자와 함께 읽기 전용 필드 사용
이 예제에서는 개체 생성 시 설정되는 firstName 및 lastName에 대해 읽기 전용 필드를 사용합니다. 이 필드는 생성자에서 단 한 번 할당될 수 있으며 이후 수정할 수 없습니다:
public class Person
{
private readonly string firstName;
private readonly string lastName;
public string FirstName => firstName;
public string LastName => lastName;
public Person(string firstName, string lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}Public Class Person
'INSTANT VB NOTE: The field firstName was renamed since Visual Basic does not allow fields to have the same name as other class members:
Private ReadOnly firstName_Conflict As String
'INSTANT VB NOTE: The field lastName was renamed since Visual Basic does not allow fields to have the same name as other class members:
Private ReadOnly lastName_Conflict As String
Public ReadOnly Property FirstName() As String
Get
Return firstName_Conflict
End Get
End Property
Public ReadOnly Property LastName() As String
Get
Return lastName_Conflict
End Get
End Property
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me.firstName_Conflict = firstName
Me.lastName_Conflict = lastName
End Sub
End Class초기화를 위한 Init 접근자 사용
또는 Init 접근자를 사용하여 객체 생성 중 초기화할 수 있지만 이후 변경할 수 없는 읽기 전용 속성을 만들 수 있습니다. 이는 읽기 전용 필드의 필요성을 없애주며 더 현대적인 문법을 제공합니다:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
End ClassIronPDF 소개

IronPDF 는 C# 개발자를 위해 설계된 강력한 PDF 생성 및 조작 라이브러리입니다. HTML을 PDF로 변환하여 PDF 문서로 변환하므로 작업을 단순화합니다. 픽셀 완벽한 렌더링, 크로스 플랫폼 지원 및 .NET 프로젝트에 쉽게 통합할 수 있는 기능을 제공하는 IronPDF는 고품질의 PDF를 빠르게 생성해야 하는 개발자에게 이상적입니다. 이는 .NET Core, Framework 및 Standard에서 사용할 수 있으며 Windows, Linux, macOS를 포함한 다양한 플랫폼을 지원합니다.
사례: C# Init 키워드와 함께 IronPDF 사용하기
C# 프로젝트에서 PDF를 생성하면서 불변 객체를 만들기 위해 init 키워드와 IronPDF를 결합할 수 있습니다. init 키워드는 객체가 초기화된 후 무결성을 보장하며 IronPDF는 데이터를 처리하고 이 불변 모델을 기반으로 PDF를 생성합니다.
프로젝트에서 IronPDF가 올바르게 참조되어 있는지 확인하십시오. NuGet을 통해 설치할 수 있습니다:
다음은 코드 예제입니다:
using IronPdf;
public class Person
{
public int Id { get; init; }
public string FirstName { get; init; }
public string LastName { get; init; }
}
public class PDFGenerator
{
public static void CreatePersonPDF(Person person)
{
var htmlContent = $@"
<html>
<body>
<h1>Person Information</h1>
<p>ID: {person.Id}</p>
<p>First Name: {person.FirstName}</p>
<p>Last Name: {person.LastName}</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs($"Person_{person.Id}.pdf");
}
}
class Program
{
static void Main(string[] args)
{
var person = new Person
{
Id = 1,
FirstName = "Iron",
LastName = "Dev"
};
PDFGenerator.CreatePersonPDF(person);
}
}Imports IronPdf
Public Class Person
Public Property Id() As Integer
Public Property FirstName() As String
Public Property LastName() As String
End Class
Public Class PDFGenerator
Public Shared Sub CreatePersonPDF(ByVal person As Person)
Dim htmlContent = $"
<html>
<body>
<h1>Person Information</h1>
<p>ID: {person.Id}</p>
<p>First Name: {person.FirstName}</p>
<p>Last Name: {person.LastName}</p>
</body>
</html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs($"Person_{person.Id}.pdf")
End Sub
End Class
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim person As New Person With {
.Id = 1,
.FirstName = "Iron",
.LastName = "Dev"
}
PDFGenerator.CreatePersonPDF(person)
End Sub
End Class결론
요약하자면, C# init 키워드는 객체 초기화 시 유연성을 제공하면서 불변 객체를 생성할 수 있게 합니다. 이는 생성자 반복 코드의 필요성을 줄이면서 private set 접근자보다 더 깔끔하고 안전한 대안입니다. init 키워드와 읽기 전용 필드, 구조체, 검증 로직을 결합하여 가독성이나 유연성을 희생하지 않으면서 불변성을 유지할 견고하고 안전한 데이터 구조를 구축하는 데 도움이 됩니다. IronPDF는 무료 체험을 제공하며, 라이선스는 $999부터 시작합니다. 이는 PDF를 편집, 압축 및 보안하는 등의 모든 기능에 대한 액세스를 제공합니다.

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


