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 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 키워드를 사용하는 이유
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 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 error
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 error
Public 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 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
{
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
{
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 string FirstName { get; init; }
public string LastName { get; init; }
}
Public Class Person
Public Property FirstName() As String
Public Property LastName() As String
End Class
IronPDF 소개

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을 통해 설치할 수 있습니다:
Install-Package IronPdf
다음은 코드 예제입니다:
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);
}
}
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는 무료 체험판을 제공하며, 라이센스는 $799부터 시작합니다. 이는 PDF를 편집, 압축 및 보안하는 등의 모든 기능에 대한 액세스를 제공합니다.
자주 묻는 질문
C#에서 HTML을 PDF로 변환하는 방법은 무엇인가요?
IronPDF의 RenderHtmlAsPdf 메서드를 사용하여 HTML 문자열을 PDF로 변환할 수 있습니다. 또한 RenderHtmlFileAsPdf 사용하여 HTML 파일을 PDF로 변환할 수도 있습니다.
C#에서 init 키워드의 목적은 무엇입니까?
init 키워드는 객체 초기화 중에만 설정할 수 있는 속성을 정의할 수 있으며, 그 후 변경이 불가능하게 하여 불변성을 보장합니다. 이는 생성 후 변경되지 말아야 하는 객체를 생성하는 데 특히 유용합니다.
C#에서 init 키워드는 객체의 불변성을 어떻게 강화합니까?
init 키워드는 객체의 초기화 단계 동안만 속성을 설정할 수 있게 하여 그 후 어떠한 변경도 허용하지 않음으로써, 객체가 생성 후 불변으로 남도록 보장합니다.
PDF 생성 라이브러리에서 init 속성을 사용할 수 있습니까?
네, init 속성은 IronPDF와 같은 라이브러리를 사용하여 불변 객체에서 PDF를 생성할 수 있게 하며, 프로세스 전반에 걸쳐 PDF에 사용되는 데이터의 일관성을 보장합니다.
전통적인 설정자보다 init 키워드를 사용하는 장점은 무엇입니까?
init 키워드는 전통적인 설정자보다 불변성을 촉진하고, 긴 생성자 코드의 필요성을 줄이며 초기화 후 객체의 속성을 수정할 수 없도록 합니다.
C#에서 불변 속성과 함께 PDF 생성을 어떻게 통합할 수 있습니까?
init 속성을 사용하여 불변 객체를 생성하고 이러한 객체를 IronPDF에 전달하여 일관되고 신뢰할 수 있는 PDF 문서를 생성할 수 있습니다.
init 키워드는 현대 C# 애플리케이션에서 어떤 역할을 합니까?
init 키워드는 개발자가 간결한 구문으로 불변 객체를 정의할 수 있도록 함으로써 코드의 안전성을 높이고 버그를 줄이며 현대 C# 애플리케이션을 만드는 데 중요한 역할을 합니다.
C# 프로젝트에서 PDF 생성 라이브러리를 어떻게 설치할 수 있습니까?
NuGet 패키지 관리자를 사용하여 C# 프로젝트에 IronPDF와 같은 라이브러리를 설치할 수 있으며 명령어는 다음과 같습니다: Install-Package IronPdf.
애플리케이션 개발에서 불변성이 중요한 이유는 무엇입니까?
불변성은 애플리케이션 전반에서 데이터의 무결성과 일관성을 보장하여 유지보수가 용이하고 버그 발생 가능성을 줄이기 때문에 중요합니다.
init 키워드의 사용을 보여주는 실례는 무엇입니까?
실용적인 예로는 초기화 시에만 설정할 수 있는 속성을 가진 클래스를 정의하기 위해 init 키워드를 사용하는 것입니다. 이는 생성된 객체가 변경되지 않음을 보장합니다. 특히 데이터 일관성이 중요한 상황에서 유용합니다.




