C# 속성 이해하기
.NET 7과 함께 도입된 C# 11은 속성에 흥미로운 기능인 required 키워드를 추가했습니다. 이 글에서는 Tim Corey의 간결한 비디오 튜토리얼 " .NET 7 업데이트: 10분 안에 배우는 필수 속성 "의 예제를 사용하여 C# 속성에 대해 살펴보겠습니다. 속성의 기본 사항부터 새롭게 추가된 필수 키워드와 그것이 초기화 규칙을 적용하는 데 어떻게 도움이 되는지까지 모든 것을 자세히 살펴보겠습니다.
C# 속성
C#에서 속성을 사용하면 필드를 캡슐화하고 객체의 클래스 데이터 멤버에 대한 액세스를 관리할 수 있습니다. 일반적으로 외부 접근을 허용하면서 데이터 무결성을 보장하는 데 사용됩니다. 비공개 필드는 속성을 사용하여 캡슐화할 수 있으며, 이를 통해 데이터에 접근하거나 수정하는 방식을 제어할 수 있습니다. 공용 문자열 속성은 클래스 멤버를 효율적으로 조작하기 위해 접근자(get 및 set)라고 하는 특수 메서드를 사용하는 경우가 많습니다. C#의 정적 속성은 클래스를 인스턴스화하지 않고도 접근할 수 있으므로 속성 값을 관리하는 독특한 방법을 제공합니다.
다음은 Tim이 간단한 부동산 예시를 통해 설명하는 방법입니다.
콘솔 애플리케이션 만들기
먼저 Tim은 C# 11을 사용하여 기본적인 .NET 7 콘솔 애플리케이션을 만듭니다. 이 버전에서는 이전 .NET 버전에는 없었던 required 키워드가 도입되었습니다.
간단한 모델 정의하기
Tim은 PersonModel 클래스에 FirstName 및 LastName 속성을 추가합니다:
public class PersonModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}public class PersonModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}이 속성들은 PersonModel이(가) 이름과 성을 저장할 수 있도록 허용합니다. 그러나 추가 설정 없이 FirstName 및 LastName이(가) 초기화되지 않고 null 값을 가질 수 있습니다.
생성자를 사용하여 초기화를 보장하는 방법
속성이 항상 초기화되도록 보장하는 일반적인 방법은 생성자를 이용하는 것입니다. Tim의 예제에서는 PersonModel 기본 클래스에 두 가지 FirstName 및 LastName을 요구하는 생성자를 추가합니다:
public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}이 접근 방식은 PersonModel 객체가 생성될 때 FirstName 및 LastName이(가) 반드시 제공되어야 한다는 것을 보장합니다. 이 값을 지정하지 않고 PersonModel을 만들려고 하면, 컴파일러가 오류로 표시할 것입니다.
널 허용 컨텍스트
.NET 6과 C# 10부터 C#은 nullable 참조 유형을 도입했습니다. 이는 속성을 초기화하거나 ?를 사용해서 명시적으로 nullable로 표시해야 함을 의미합니다. 예를 들어, FirstName 및 LastName이(가) null이 될 수 있는 경우 다음과 같이 정의합니다:
public string? FirstName { get; set; }
public string? LastName { get; set; }public string? FirstName { get; set; }
public string? LastName { get; set; }그러나 Tim의 예제에서는 FirstName 및 LastName이(가) 항상 null이 아닌 것으로 가정합니다. 초기에는 null 허용 여부를 신중한 초기화 또는 nullable 어노테이션으로 처리했지만, C# 11부터는 더욱 강력한 옵션을 사용할 수 있게 되었습니다.
필수 키워드를 소개합니다
생성자가 초기화를 강제할 수 있는 반면, C# 11은 required 키워드를 도입하여 특정 속성이 설정되었는지 확인하기 쉽게 만듭니다. required을 사용하면 개별 속성을 필수로 표시할 수 있으며 이는 객체 초기화 중에 반드시 값이 할당되어야 함을 의미합니다.
필수 속성 설정
필수 속성으로 FirstName 및 LastName을 만들기 위해 Tim은 4:15에 PersonModel 클래스를 다음과 같이 수정합니다:
public class PersonModel
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
}public class PersonModel
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
}이 속성을 required로 표시하면 컴파일러가 객체 이니셜라이저나 생성자를 통해 설정되어야 한다고 강제하게 됩니다. 이 방법은 생성자를 만들 필요 없이 특정 속성을 요구할 수 있기 때문에 유용합니다.
필수 속성을 사용한 예시
이제 PersonModel을 다음과 같이 생성하고 초기화할 수 있습니다:
PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };PersonModel person = new() { FirstName = "Tim", LastName = "Corey" };FirstName 또는 LastName을 생략하면, 컴파일러는 오류를 표시하며 이러한 필수 속성을 초기화하도록 요청합니다.
생성자와 함께 필수 사용하기
Tim은 required 속성과 생성자가 둘 다 사용되는 경우를 시연합니다. 생성자가 필수 속성을 설정하는 경우, C#은 생성자가 호출될 때 해당 속성이 여전히 초기화되어 있는지 확인해야 합니다.
이런 경우 SetsRequiredMembers 속성은 생성자가 필수 조건을 충족함을 신호로 사용할 수 있습니다. 팀이 이를 적용하는 방법은 다음과 같습니다.
[SetsRequiredMembers]
public PersonModel()
{
FirstName = "Test";
LastName = "Test";
}
[SetsRequiredMembers]
public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}[SetsRequiredMembers]
public PersonModel()
{
FirstName = "Test";
LastName = "Test";
}
[SetsRequiredMembers]
public PersonModel(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}SetsRequiredMembers을 추가하면 컴파일러에게 이러한 속성이 생성자 내에서 설정될 것임을 알리고 초기화 오류를 피합니다. 이 기능은 속성을 초기화하는 방식에 유연성을 제공하면서 실수로 인한 누락을 방지하는 데 도움이 됩니다.
필수 속성이 유용한 이유는 무엇일까요?
Tim은 새로운 required 키워드가 속성이 항상 설정될 수 있도록 하는 과정을 간소화한다고 설명합니다. 이제 모든 경우에 set 메서드에 대한 생성자가 필요하거나 설정되지 않은 속성이 발생할 위험을 감수할 필요 없이, 속성 선언에서 특정 값을 직접 요구하는 간단한 방법을 사용할 수 있습니다.
이 기능은 특정 필드가 필수인 데이터 모델에서 특히 유용하며, 런타임 시 null 오류를 방지하여 개발 과정 초기에 문제를 파악하는 데 도움이 됩니다.
추가 속성 예시
Tim은 nullable일 수 있는 선택 속성 Email을 추가했습니다:
public string? Email { get; set; }public string? Email { get; set; }required로 표시되지 않았기 때문에 Email 속성은 컴파일러 오류 없이 설정되지 않은 상태로 남을 수 있습니다. 이 예시를 통해 Tim은 필수 데이터 필드와 선택적 데이터 필드를 명확하게 구분한 클래스가 얼마나 유연하게 작동할 수 있는지 보여주었습니다.
결론
C# 11에 필수 속성이 추가된 것은 개발자에게 매우 유용한 기능으로, 필수 속성이 항상 초기화되도록 보장합니다. 팀 코리의 영상은 이 기능에 대한 훌륭한 소개를 제공하며 콘솔 애플리케이션 내에서 어떻게 작동하는지 보여줍니다. required 키워드를 객체 이니셜라이저 및 생성자와 결합함으로써 C#에서 더 견고하고 안전한 데이터 모델을 만들 수 있습니다. 더 자세한 튜토리얼을 보시려면 Tim의 YouTube 채널을 방문하세요.

