푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 배우기
C# 배우기

다른 카테고리

C# 속성 이해하기

Tim Corey
9분 50초

.NET 7과 함께 도입된 C# 11은 속성에 흥미로운 기능인 required 키워드를 추가했습니다. 이 글에서는 Tim Corey의 간결한 비디오 튜토리얼 " .NET 7 업데이트: 10분 안에 배우는 필수 속성 "의 예제를 사용하여 C# 속성에 대해 살펴보겠습니다. 속성의 기본 사항부터 새롭게 추가된 필수 키워드와 그것이 초기화 규칙을 적용하는 데 어떻게 도움이 되는지까지 모든 것을 자세히 살펴보겠습니다.

C# 속성

C#에서 속성을 사용하면 필드를 캡슐화하고 객체의 클래스 데이터 멤버에 대한 액세스를 관리할 수 있습니다. 일반적으로 외부 접근을 허용하면서 데이터 무결성을 보장하는 데 사용됩니다. 비공개 필드는 속성을 사용하여 캡슐화할 수 있으며, 이를 통해 데이터에 접근하거나 수정하는 방식을 제어할 수 있습니다. 공용 문자열 속성은 클래스 멤버를 효율적으로 조작하기 위해 접근자(get 및 set)라고 하는 특수 메서드를 사용하는 경우가 많습니다. C#의 정적 속성은 클래스를 인스턴스화하지 않고도 접근할 수 있으므로 속성 값을 관리하는 독특한 방법을 제공합니다.

다음은 Tim이 간단한 부동산 예시를 통해 설명하는 방법입니다.

콘솔 애플리케이션 만들기

먼저 Tim은 C# 11을 사용하여 기본적인 .NET 7 콘솔 애플리케이션을 만듭니다. 이 버전에서는 이전 .NET 버전에는 없었던 required 키워드가 도입되었습니다.

간단한 모델 정의하기

팀은 PersonModel 클래스에 FirstNameLastName에 대한 속성을 생성합니다:

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가 이름과 성을 저장할 수 있게 합니다. 그러나 추가 설정이 없으면 FirstNameLastName는 초기화되지 않을 수 있으며, 이는 null 값을 초래할 수 있습니다.

생성자를 사용하여 초기화를 보장하는 방법

속성이 항상 초기화되도록 보장하는 일반적인 방법은 생성자를 이용하는 것입니다. 팀의 예에서, 그는 FirstNameLastName를 모두 필요로 하는 PersonModel의 기본 클래스에 생성자를 추가합니다:

public PersonModel(string firstName, string lastName)
{
    FirstName = firstName;
    LastName = lastName;
}
public PersonModel(string firstName, string lastName)
{
    FirstName = firstName;
    LastName = lastName;
}

이 접근 방식은 PersonModel 객체가 생성될 때마다 FirstNameLastName가 제공되어야 함을 강제합니다. 이러한 값을 명시하지 않고 PersonModel를 생성하려고 하면, 컴파일러는 이를 오류로 표시합니다.

널 허용 컨텍스트

.NET 6 및 C# 10부터 C#은 nullable reference 타입을 도입했습니다. 이는 속성이 초기화되거나 ?를 사용하여 명시적으로 nullable로 표시되어야 함을 의미합니다. 예를 들어, FirstNameLastName가 null일 수 있다면, 이를 다음과 같이 정의합니다:

public string? FirstName { get; set; }
public string? LastName { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }

그러나 팀의 예에서는 우리는 FirstNameLastName가 항상 null이 아님을 가정합니다. 초기에는 null 허용 여부를 신중한 초기화 또는 nullable 어노테이션으로 처리했지만, C# 11부터는 더욱 강력한 옵션을 사용할 수 있게 되었습니다.

필수 키워드를 소개합니다

생성자가 초기화를 강제할 수 있는 동안, C# 11은 required 키워드를 도입하여 특정 속성들이 설정되도록 쉽게 만듭니다. required으로 각 속성을 필수로 표시할 수 있으며 이는 객체 초기화 동안 값이 할당되어야 함을 의미합니다.

필수 속성 설정

FirstNameLastName를 필수 속성으로 만들기 위해, 팀은 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를 생략하면, 컴파일러는 오류를 표시하며 이 필수 속성들을 초기화 하도록 요구할 것입니다.

생성자와 함께 필수 사용하기

팀은 두 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를 추가함으로써 이러한 속성이 생성자 내에서 설정될 것임을 컴파일러에 알려 초기화 오류를 피할 수 있습니다. 이 기능은 속성을 초기화하는 방식에 유연성을 제공하면서 실수로 인한 누락을 방지하는 데 도움이 됩니다.

필수 속성이 유용한 이유는 무엇일까요?

팀은 required 새로운 키워드가 속성을 항상 설정되도록 보장하는 과정을 간소화한다고 설명합니다. 이제 모든 경우에 set 메서드에 대한 생성자가 필요하거나 설정되지 않은 속성이 발생할 위험을 감수할 필요 없이, 속성 선언에서 특정 값을 직접 요구하는 간단한 방법을 사용할 수 있습니다.

이 기능은 특정 필드가 필수인 데이터 모델에서 특히 유용하며, 런타임 시 null 오류를 방지하여 개발 과정 초기에 문제를 파악하는 데 도움이 됩니다.

추가 속성 예시

그 후 팀은 nullable일 수 있는 선택적 속성 Email을 추가했습니다:

public string? Email { get; set; }
public string? Email { get; set; }

이는 required로 표시되지 않았기 때문에, Email 속성은 설정되지 않아도 컴파일러 오류가 발생하지 않습니다. 이 예시를 통해 Tim은 필수 데이터 필드와 선택적 데이터 필드를 명확하게 구분한 클래스가 얼마나 유연하게 작동할 수 있는지 보여주었습니다.

결론

C# 11에 필수 속성이 추가된 것은 개발자에게 매우 유용한 기능으로, 필수 속성이 항상 초기화되도록 보장합니다. 팀 코리의 영상은 이 기능에 대한 훌륭한 소개를 제공하며 콘솔 애플리케이션 내에서 어떻게 작동하는지 보여줍니다. required 키워드를 객체 초기화자 및 생성자와 결합함으로써, 우리는 C#에서 더 견고하고 안전한 데이터 모델을 만들 수 있습니다. 더 자세한 튜토리얼을 보시려면 Tim의 YouTube 채널을 방문하세요.

Hero Worlddot related to C# 속성 이해하기
Hero Affiliate related to C# 속성 이해하기

사랑하는 것을 공유하여 더 많은 수익을 얻으세요

당신은 .NET, C#, Java, Python, 또는 Node.js를 다루는 개발자를 위한 콘텐츠를 만드나요? 당신의 전문성을 추가 수입으로 전환하세요!

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해