C# 확장 메서드 (개발자를 위한 작동 방식)
확장 메서드는 C#의 강력한 기능으로, 소스 코드를 수정하지 않고 기존 타입에 새로운 기능을 추가할 수 있게 해줍니다. 이는 코드의 가독성과 유지보수성을 크게 높이는 데 매우 유용할 수 있습니다. 이 안내서에서는 확장 메서드의 기본 개념 및 구현 방법을 살펴볼 것입니다.
확장 메서드란 무엇인가요?
확장 메서드는 기존 타입의 인스턴스 메서드처럼 호출할 수 있는 특별한 정적 메서드입니다. 이는 원본 소스 코드를 변경하거나 클래스에서 상속받지 않고 기존 클래스에 새 메서드를 추가하는 편리한 방법입니다.
확장 메서드를 만들려면 정적 클래스 내에 정적 메서드를 정의해야 합니다. 메서드의 첫 번째 매개변수는 확장하려는 형식을 나타내야 하며, this 키워드가 접두사로 붙습니다. 이 특별한 키워드는 C# 컴파일러에게 이것이 확장 메서드임을 알려줍니다.
Implementing Extension Methods in C
이제 확장 메서드가 무엇인지 알았으니, 하나를 구현해봅시다. 문자열을 뒤집고 싶다고 상상해 보세요. 이를 위해 별도의 함수를 작성하는 대신, 문자열 클래스에 대한 확장 메서드를 만들 수 있습니다.
먼저, StringExtensions라는 새로운 정적 클래스를 생성합시다. 클래스 이름은 중요하지 않지만, 일반적으로 확장되는 타입 이름 뒤에 "Extensions"를 붙이는 것이 일반적입니다. 이 클래스 내에서 Reverse라는 정적 메서드를 정의할 것입니다:
public static class StringExtensions
{
// This extension method reverses a given string.
public static string Reverse(this string input)
{
// Convert the string to a character array.
char[] chars = input.ToCharArray();
// Reverse the array in place.
Array.Reverse(chars);
// Create a new string from the reversed character array and return it.
return new string(chars);
}
}
public static class StringExtensions
{
// This extension method reverses a given string.
public static string Reverse(this string input)
{
// Convert the string to a character array.
char[] chars = input.ToCharArray();
// Reverse the array in place.
Array.Reverse(chars);
// Create a new string from the reversed character array and return it.
return new string(chars);
}
}
Public Module StringExtensions
' This extension method reverses a given string.
<System.Runtime.CompilerServices.Extension> _
Public Function Reverse(ByVal input As String) As String
' Convert the string to a character array.
Dim chars() As Char = input.ToCharArray()
' Reverse the array in place.
Array.Reverse(chars)
' Create a new string from the reversed character array and return it.
Return New String(chars)
End Function
End Module
이 예제에서는 Reverse라는 공개 정적 문자열 메서드를 단일 매개변수와 함께 만들었습니다. 문자열 형식 앞의 this 키워드는 이 메서드가 문자열 클래스에 대한 확장 메서드임을 나타냅니다.
이제 이 새로운 확장 메서드를 우리의 Program 클래스에서 사용하는 방법을 봅시다:
class Program
{
static void Main(string[] args)
{
string example = "Hello, World!";
// Call the extension method as if it were an instance method.
string reversed = example.Reverse();
Console.WriteLine(reversed); // Output: !dlroW ,olleH
}
}
class Program
{
static void Main(string[] args)
{
string example = "Hello, World!";
// Call the extension method as if it were an instance method.
string reversed = example.Reverse();
Console.WriteLine(reversed); // Output: !dlroW ,olleH
}
}
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim example As String = "Hello, World!"
' Call the extension method as if it were an instance method.
Dim reversed As String = example.Reverse()
Console.WriteLine(reversed) ' Output: !dlroW ,olleH
End Sub
End Class
우리가 StringExtensions 클래스의 인스턴스를 생성하지 않았다는 것을 주목하세요. 대신, 마치 인스턴스 메서드인 것처럼 문자열 인스턴스에 Reverse 메서드를 직접 사용했습니다.
확장 메서드 구문
확장 메서드는 인스턴스 메서드처럼 보이고 작동하지만, 유념해야 할 몇 가지 중요한 차이점이 있습니다:
- 확장 메서드는 확장된 타입의 비공개 멤버에 접근할 수 없습니다.
- 또한 상속이나 다형성에 참여하지 않습니다.
- 확장 메서드로 기존 메서드를 재정의할 수 없습니다.
확장된 타입에 확장 메서드와 동일한 시그니처의 메서드가 있는 경우, 인스턴스 메서드가 항상 우선권을 가집니다. 확장 메서드는 일치하는 인스턴스 메서드가 없을 때만 호출됩니다.
확장 메서드의 실제 사례
이제 C#에서 확장 메서드의 기본 개념을 이해했으니, 현실 세계의 몇 가지 사례를 살펴봅시다.
문자열 확장 메서드 단어 개수
문자열에 있는 단어의 수를 세고 싶다고 상상해 보세요. 문자열 클래스에 대한 WordCount 확장 메서드를 생성할 수 있습니다:
public static class StringExtensions
{
// This extension method counts the number of words in a string.
public static int WordCount(this string input)
{
// Split the string by whitespace characters and return the length of the resulting array.
return input.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
public static class StringExtensions
{
// This extension method counts the number of words in a string.
public static int WordCount(this string input)
{
// Split the string by whitespace characters and return the length of the resulting array.
return input.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
Imports Microsoft.VisualBasic
Public Module StringExtensions
' This extension method counts the number of words in a string.
<System.Runtime.CompilerServices.Extension> _
Public Function WordCount(ByVal input As String) As Integer
' Split the string by whitespace characters and return the length of the resulting array.
Return input.Split( { " "c, ControlChars.Tab, ControlChars.Cr, ControlChars.Lf }, StringSplitOptions.RemoveEmptyEntries).Length
End Function
End Module
이제 이렇게 문자열의 단어 수를 쉽게 셀 수 있습니다:
string text = "Extension methods are awesome!";
int wordCount = text.WordCount();
Console.WriteLine($"The text has {wordCount} words."); // Output: The text has 4 words.
string text = "Extension methods are awesome!";
int wordCount = text.WordCount();
Console.WriteLine($"The text has {wordCount} words."); // Output: The text has 4 words.
Dim text As String = "Extension methods are awesome!"
Dim wordCount As Integer = text.WordCount()
Console.WriteLine($"The text has {wordCount} words.") ' Output: The text has 4 words.
IEnumerable 확장 메서드 중앙값
숫자 모음이 있고 그 중앙값을 계산하고자 한다고 가정해봅시다. IEnumerable<int>에 대한 확장 메서드를 생성할 수 있습니다:
using System;
using System.Collections.Generic;
using System.Linq;
public static class EnumerableExtensions
{
// This extension method calculates the median of a collection of integers.
public static double Median(this IEnumerable<int> source)
{
// Sort the collection and convert it to an array.
int[] sorted = source.OrderBy(x => x).ToArray();
int count = sorted.Length;
if (count == 0)
{
throw new InvalidOperationException("The collection is empty.");
}
// If the count is even, return the average of the two middle elements.
if (count % 2 == 0)
{
return (sorted[count / 2 - 1] + sorted[count / 2]) / 2.0;
}
else
{
// Otherwise, return the middle element.
return sorted[count / 2];
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
public static class EnumerableExtensions
{
// This extension method calculates the median of a collection of integers.
public static double Median(this IEnumerable<int> source)
{
// Sort the collection and convert it to an array.
int[] sorted = source.OrderBy(x => x).ToArray();
int count = sorted.Length;
if (count == 0)
{
throw new InvalidOperationException("The collection is empty.");
}
// If the count is even, return the average of the two middle elements.
if (count % 2 == 0)
{
return (sorted[count / 2 - 1] + sorted[count / 2]) / 2.0;
}
else
{
// Otherwise, return the middle element.
return sorted[count / 2];
}
}
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Public Module EnumerableExtensions
' This extension method calculates the median of a collection of integers.
<System.Runtime.CompilerServices.Extension> _
Public Function Median(ByVal source As IEnumerable(Of Integer)) As Double
' Sort the collection and convert it to an array.
Dim sorted() As Integer = source.OrderBy(Function(x) x).ToArray()
Dim count As Integer = sorted.Length
If count = 0 Then
Throw New InvalidOperationException("The collection is empty.")
End If
' If the count is even, return the average of the two middle elements.
If count Mod 2 = 0 Then
Return (sorted(count \ 2 - 1) + sorted(count \ 2)) / 2.0
Else
' Otherwise, return the middle element.
Return sorted(count \ 2)
End If
End Function
End Module
이 확장 메서드를 사용하면 컬렉션의 중앙값을 쉽게 찾을 수 있습니다:
int[] numbers = { 5, 3, 9, 1, 4 };
double median = numbers.Median();
Console.WriteLine($"The median value is {median}."); // Output: The median value is 4.
int[] numbers = { 5, 3, 9, 1, 4 };
double median = numbers.Median();
Console.WriteLine($"The median value is {median}."); // Output: The median value is 4.
Dim numbers() As Integer = { 5, 3, 9, 1, 4 }
Dim median As Double = numbers.Median()
Console.WriteLine($"The median value is {median}.") ' Output: The median value is 4.
DateTime 확장 메서드 StartOfWeek
주어진 날짜의 주 시작점을 찾고자 한다고 해봅시다. DateTime 구조체에 대한 확장 메서드를 생성할 수 있습니다:
public static class DateTimeExtensions
{
// This extension method calculates the start of the week for a given date.
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek = DayOfWeek.Monday)
{
// Calculate the difference in days between the current day and the start of the week.
int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
// Subtract the difference to get the start of the week.
return dt.AddDays(-1 * diff).Date;
}
}
public static class DateTimeExtensions
{
// This extension method calculates the start of the week for a given date.
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek = DayOfWeek.Monday)
{
// Calculate the difference in days between the current day and the start of the week.
int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
// Subtract the difference to get the start of the week.
return dt.AddDays(-1 * diff).Date;
}
}
Public Module DateTimeExtensions
' This extension method calculates the start of the week for a given date.
'INSTANT VB NOTE: The parameter startOfWeek was renamed since Visual Basic will not allow parameters with the same name as their enclosing function or property:
<System.Runtime.CompilerServices.Extension> _
Public Function StartOfWeek(ByVal dt As DateTime, Optional ByVal startOfWeek_Conflict As DayOfWeek = DayOfWeek.Monday) As DateTime
' Calculate the difference in days between the current day and the start of the week.
Dim diff As Integer = (7 + (dt.DayOfWeek - startOfWeek_Conflict)) Mod 7
' Subtract the difference to get the start of the week.
Return dt.AddDays(-1 * diff).Date
End Function
End Module
이제 어떤 날짜의 주 시작점도 쉽게 찾을 수 있습니다:
DateTime today = DateTime.Today;
DateTime startOfWeek = today.StartOfWeek();
Console.WriteLine($"The start of the week is {startOfWeek.ToShortDateString()}.");
// Output will depend on the current date, e.g. The start of the week is 17/06/2024.
DateTime today = DateTime.Today;
DateTime startOfWeek = today.StartOfWeek();
Console.WriteLine($"The start of the week is {startOfWeek.ToShortDateString()}.");
// Output will depend on the current date, e.g. The start of the week is 17/06/2024.
Dim today As DateTime = DateTime.Today
Dim startOfWeek As DateTime = today.StartOfWeek()
Console.WriteLine($"The start of the week is {startOfWeek.ToShortDateString()}.")
' Output will depend on the current date, e.g. The start of the week is 17/06/2024.
IronPDF와 확장 메서드를 사용한 PDF 생성
이 섹션에서는 C#에서 PDF 파일을 생성하고 작업할 수 있는 업계 선도적 라이브러리인 IronPDF를 소개합니다. 또한 이 라이브러리로 작업할 때 더 원활하고 직관적인 경험을 만들기 위해 확장 메서드를 활용할 수 있는 방법을 살펴보겠습니다.
IronPDF는 HTML을 웹 브라우저에서의 모습처럼 레이아웃과 스타일을 보존하면서 PDF로 변환합니다. 이 라이브러리는 파일, URL, 문자열에서의 원시 HTML과 작업할 수 있습니다. 다음은 간단한 개요입니다:
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
// 1. 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");
// 2. 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");
// 3. Convert URL to PDF
var url = "http://ironpdf.com"; // Specify the URL
var pdfFromUrl = renderer.RenderUrlAsPdf(url);
pdfFromUrl.SaveAs("URLToPDF.pdf");
}
}
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
// 1. 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");
// 2. 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");
// 3. Convert URL to PDF
var url = "http://ironpdf.com"; // Specify the URL
var pdfFromUrl = renderer.RenderUrlAsPdf(url);
pdfFromUrl.SaveAs("URLToPDF.pdf");
}
}
Imports IronPdf
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim renderer = New ChromePdfRenderer()
' 1. Convert HTML String to PDF
Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")
' 2. Convert HTML File to PDF
Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")
' 3. Convert URL to PDF
Dim url = "http://ironpdf.com" ' Specify the URL
Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
pdfFromUrl.SaveAs("URLToPDF.pdf")
End Sub
End Class
간단한 PDF 생성
확장 메서드에 들어가기 전에, IronPDF를 사용하여 HTML에서 간단한 PDF를 생성하는 방법을 살펴보겠습니다:
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var PDF = renderer.RenderHtmlAsPdf("Hello, World!");
PDF.SaveAs("HelloWorld.PDF");
}
}
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var PDF = renderer.RenderHtmlAsPdf("Hello, World!");
PDF.SaveAs("HelloWorld.PDF");
}
}
Imports IronPdf
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim renderer = New ChromePdfRenderer()
Dim PDF = renderer.RenderHtmlAsPdf("Hello, World!")
PDF.SaveAs("HelloWorld.PDF")
End Sub
End Class
이 코드 스니펫은 "Hello, World!"라는 텍스트가 있는 PDF를 생성하고 "HelloWorld.PDF"라는 이름의 파일에 저장합니다.
IronPDF를 위한 확장 메서드
이제 IronPDF의 기능을 향상시키고 작업을 더욱 쉽게 만들기 위해 확장 메서드를 어떻게 사용할 수 있는지 살펴봅시다. 예를 들어, 문자열 클래스의 인스턴스를 직접 PDF로 생성하는 확장 메서드를 만들 수 있습니다.
using IronPdf;
public static class StringExtensions
{
// This extension method converts a string containing HTML to a PDF and saves it.
public static void SaveAsPdf(this string htmlContent, string filePath)
{
var renderer = new ChromePdfRenderer();
var PDF = renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs(filePath);
}
}
using IronPdf;
public static class StringExtensions
{
// This extension method converts a string containing HTML to a PDF and saves it.
public static void SaveAsPdf(this string htmlContent, string filePath)
{
var renderer = new ChromePdfRenderer();
var PDF = renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs(filePath);
}
}
Imports IronPdf
Public Module StringExtensions
' This extension method converts a string containing HTML to a PDF and saves it.
<System.Runtime.CompilerServices.Extension> _
Public Sub SaveAsPdf(ByVal htmlContent As String, ByVal filePath As String)
Dim renderer = New ChromePdfRenderer()
Dim PDF = renderer.RenderHtmlAsPdf(htmlContent)
PDF.SaveAs(filePath)
End Sub
End Module
이 확장 메서드를 사용하면 이제 문자열에서 직접 PDF를 생성할 수 있습니다:
string html = "<h1>Extension Methods and IronPDF</h1><p>Generating PDFs has never been easier!</p>";
html.SaveAsPdf("ExtensionMethodsAndIronPdf.PDF");
string html = "<h1>Extension Methods and IronPDF</h1><p>Generating PDFs has never been easier!</p>";
html.SaveAsPdf("ExtensionMethodsAndIronPdf.PDF");
Dim html As String = "<h1>Extension Methods and IronPDF</h1><p>Generating PDFs has never been easier!</p>"
html.SaveAsPdf("ExtensionMethodsAndIronPdf.PDF")
URL에서 PDF 생성
또한 유용한 확장 메서드로 URL에서 PDF를 생성하는 메서드를 만들 수 있습니다. 이것을 달성하기 위해 Uri 클래스를 확장할 수 있습니다:
using IronPdf;
public static class UriExtensions
{
// This extension method converts a web URL to a PDF and saves it.
public static void SaveAsPdf(this Uri url, string filePath)
{
var renderer = new ChromePdfRenderer();
var PDF = renderer.RenderUrlAsPdf(url.AbsoluteUri);
PDF.SaveAs(filePath);
}
}
using IronPdf;
public static class UriExtensions
{
// This extension method converts a web URL to a PDF and saves it.
public static void SaveAsPdf(this Uri url, string filePath)
{
var renderer = new ChromePdfRenderer();
var PDF = renderer.RenderUrlAsPdf(url.AbsoluteUri);
PDF.SaveAs(filePath);
}
}
Imports IronPdf
Public Module UriExtensions
' This extension method converts a web URL to a PDF and saves it.
<System.Runtime.CompilerServices.Extension> _
Public Sub SaveAsPdf(ByVal url As Uri, ByVal filePath As String)
Dim renderer = New ChromePdfRenderer()
Dim PDF = renderer.RenderUrlAsPdf(url.AbsoluteUri)
PDF.SaveAs(filePath)
End Sub
End Module
이제 이렇게 URL에서 쉽게 PDF를 생성할 수 있습니다:
Uri url = new Uri("https://www.ironpdf.com/");
url.SaveAsPdf("UrlToPdf.PDF");
Uri url = new Uri("https://www.ironpdf.com/");
url.SaveAsPdf("UrlToPdf.PDF");
Dim url As New Uri("https://www.ironpdf.com/")
url.SaveAsPdf("UrlToPdf.PDF")
결론
그리고 보시다시피, C#에서 확장 메서드의 개념을 탐구하고, 정적 메서드와 정적 클래스를 사용하여 구현 방법을 습득하며, 실제 사례를 다양한 유형에 사용했습니다. 또한 C#에서 PDF 파일을 생성하고 작업할 수 있는 IronPDF라는 라이브러리를 소개했습니다. 확장 메서드와 IronPDF를 함께 사용하기 시작하면 코드가 얼마나 깔끔하고 읽기 쉽고 효율적으로 변하는지 알게 될 것입니다.
IronPDF를 직접 사용해볼 준비가 되었나요? IronPDF의 30일 무료 체험으로 시작할 수 있습니다. 개발 목적 사용 시 완전히 무료이므로 실제로 어떤 것인지 확인할 수 있습니다. 당신이 보는 것이 마음에 든다면, IronPDF 라이선스 세부 사항을 위해 liteLicense로 IronPDF를 시작할 수 있습니다. 큰 절약도 하고 싶으시면 Iron Software Suite의 구매 옵션을 확인해 보세요. 두 가지 가격으로 아홉 가지 Iron Software 도구를 모두 얻을 수 있습니다. 즐거운 코딩 되세요!

자주 묻는 질문
C# 확장 메서드란 무엇이며 어떻게 유용한가요?
C# 확장 메서드는 기존 타입의 소스 코드를 변경하지 않고도 새로운 기능을 추가할 수 있도록 하는 정적 메서드입니다. 이 메서드들은 코드의 가독성과 유지보수성을 높이면서 인스턴스 메서드인 것처럼 호출할 수 있게 해줍니다.
C#에서 확장 메서드를 만드는 방법은 무엇인가요?
확장 메서드를 만들려면 정적 클래스 내에 정적 메서드를 정의하세요. 메서드의 첫 번째 매개변수는 확장하려는 타입이어야 하며, 이 매개변수 앞에는 this 키워드가 와야 합니다.
확장 메서드를 사용하여 C#에서 PDF를 생성할 수 있나요?
네, 확장 메서드는 C#에서 PDF 생성을 간소화할 수 있습니다. 예를 들어 문자열에 대한 확장 메서드를 개발하여 HTML 콘텐츠를 PDF로 직접 변환할 수 있습니다.
C#에서 HTML 콘텐츠를 PDF로 변환할 수 있는 방법은 무엇인가요?
PDF 라이브러리의 메서드를 사용하여 HTML 문자열을 PDF로 변환할 수 있습니다. 확장 메서드를 구현하여 간단한 메서드 호출로 HTML 콘텐츠를 PDF로 변환할 수 있게 합니다.
C#에서 확장 메서드를 사용할 때의 제한 사항은 무엇인가요?
확장 메서드는 확장하는 타입의 비공개 멤버에 접근할 수 없습니다. 또한 상속이나 다형성에 참여하지 않으며, 기존의 인스턴스 메서드를 오버라이드할 수 없습니다.
확장 메서드가 PDF 라이브러리 작업을 어떻게 향상시킬 수 있나요?
확장 메서드는 PDF 라이브러리와의 작업을 단순화하여 라이브러리 기능과 상호작용하는 방법을 간소화할 수 있습니다. 예를 들어 URL이나 HTML 콘텐츠를 직접 PDF로 변환하는 메서드를 만들어 코딩 프로세스를 간소화할 수 있습니다.
C#에서 확장 메서드를 사용하여 URL을 PDF로 변환하는 방법은 무엇인가요?
Uri 클래스를 확장 메서드로 확장하여 PDF 라이브러리를 사용해 웹 URL을 PDF 파일로 변환할 수 있습니다. 이 메서드는 URL을 받아 지정된 파일 경로에 생성된 PDF를 저장할 수 있습니다.
C# 확장 메서드의 실용적인 예는 무엇인가요?
C# 확장 메서드의 실용적인 예로는 문자열에 대한 Reverse 메서드 추가, 문자열의 단어 수 세기 메서드, 정수 컬렉션의 중간값 계산 메서드, 및 DateTime 구조체의 주 시작일 찾기 메서드 등이 있습니다.




