C# 11: required 멤버 (required modifier)
C# 11은 class나 struct 안의 필드나 속성에 대해 객체 생성시 그 값이 초기화되어져야 한다는 것을 표시하는 'required' modifier를 도입하였다. 즉, 필드나 속성 앞에 required 로 표시하면, 객체가 생성될 때 그 초기값이 지정되어야 한다.
required 멤버에 대한 초기값은 생성자(constructor)나 Object Initalizer에 의해 지정될 수 있다. 특히, '모든 required 멤버들'에 대한 초기값을 지정하는 생성자에 대해서는 생성자 앞에 [SetsRequiredMembers] 라는 attribute를 표시하는데, 이는 컴파일러에게 해당 생성자가 모든 required 멤버들을 초기화 할 수 있는 것이라고 알려주는 역활을 한다.
아래 예제에서 Customer 클래스는 Id와 Name 속성 앞에 required 라는 키워드를 갖는데, 이 멤버들은 객체 생성시 초기화되어져야 한다는 것을 의미한다. Customer 클래스는 2개의 생성자를 가지고 있는데, 첫번째 생성자는 디폴트 생성자로 입력 파라미터를 갖지 않으며, 두번째 생성자는 id와 name 등 2개의 파라미터를 가지고 있다. 만약 첫번째 생성자를 호출해서 'var c = new Customer()' 와 같이 객체를 생성하면, required 멤버들을 초기화하지 않기 때문에 아래 그림과 같은 에러가 발생한다.
required 멤버들을 초기화하면서 객체를 생성하기 위해서는 아래 객체 생성 예제와 같이 (1) 모든 required 멤버를 초기화할 수 있는 생성자를 사용하는 방법과 (2) 모든 required 멤버들을 초기화하는 Object Initalizer를 사용하는 방법이 있다. 물론 Object Initalizer를 사용하더라도 required 멤버들을 모두 초기화하지 않으면 에러가 발생한다.
required 멤버에 대한 초기값은 생성자(constructor)나 Object Initalizer에 의해 지정될 수 있다. 특히, '모든 required 멤버들'에 대한 초기값을 지정하는 생성자에 대해서는 생성자 앞에 [SetsRequiredMembers] 라는 attribute를 표시하는데, 이는 컴파일러에게 해당 생성자가 모든 required 멤버들을 초기화 할 수 있는 것이라고 알려주는 역활을 한다.
아래 예제에서 Customer 클래스는 Id와 Name 속성 앞에 required 라는 키워드를 갖는데, 이 멤버들은 객체 생성시 초기화되어져야 한다는 것을 의미한다. Customer 클래스는 2개의 생성자를 가지고 있는데, 첫번째 생성자는 디폴트 생성자로 입력 파라미터를 갖지 않으며, 두번째 생성자는 id와 name 등 2개의 파라미터를 가지고 있다. 만약 첫번째 생성자를 호출해서 'var c = new Customer()' 와 같이 객체를 생성하면, required 멤버들을 초기화하지 않기 때문에 아래 그림과 같은 에러가 발생한다.
required 멤버들을 초기화하면서 객체를 생성하기 위해서는 아래 객체 생성 예제와 같이 (1) 모든 required 멤버를 초기화할 수 있는 생성자를 사용하는 방법과 (2) 모든 required 멤버들을 초기화하는 Object Initalizer를 사용하는 방법이 있다. 물론 Object Initalizer를 사용하더라도 required 멤버들을 모두 초기화하지 않으면 에러가 발생한다.
예제
public class Customer
{
// required 멤버들을 초기화하지 않는 생성자
public Customer() { }
// required 멤버들을 초기화하는 생성자
[SetsRequiredMembers]
public Customer(int id, string name)
{
this.Id = id;
this.Name = name;
}
// required 멤버들
public required int Id { get; init; }
public required string Name { get; init; }
// required가 아닌 멤버
public string Address { get; init; }
}
// -------------- 객체 생성 ----------------
// (1) SetsRequiredMembers 생성자를 사용하는 경우
var c1 = new Customer(1, "Tom");
// (2) Object Initializer를 사용하는 경우
var c2 = new Customer { Id = 2, Name = "Jerry" };
{
// required 멤버들을 초기화하지 않는 생성자
public Customer() { }
// required 멤버들을 초기화하는 생성자
[SetsRequiredMembers]
public Customer(int id, string name)
{
this.Id = id;
this.Name = name;
}
// required 멤버들
public required int Id { get; init; }
public required string Name { get; init; }
// required가 아닌 멤버
public string Address { get; init; }
}
// -------------- 객체 생성 ----------------
// (1) SetsRequiredMembers 생성자를 사용하는 경우
var c1 = new Customer(1, "Tom");
// (2) Object Initializer를 사용하는 경우
var c2 = new Customer { Id = 2, Name = "Jerry" };