init(C# 참조)
init
키워드는 속성 또는 인덱스 작성기의 접근자 메서드를 정의합니다. init 전용 setter는 개체 생성 중에만 속성 또는 인덱서 요소에 값을 할당합니다. init
는 불변성을 적용하므로 개체가 초기화되면 변경할 수 없습니다. init
접근자를 사용하면 호출 코드에서 개체 이니셜라이저를 사용하여 초기 값을 설정할 수 있습니다. 이와 대조적으로, get
설정자만 있는 자동 구현 속성은 생성자를 호출하여 초기화해야 합니다. private set
접근자가 있는 속성은 생성 후에 수정할 수 있지만 클래스에서만 가능합니다.
다음 예제에서는 YearOfBirth
라는 속성의 get
및 init
접근자를 모두 정의합니다. _yearOfBirth
라는 private 필드를 사용하여 속성 값을 지원합니다.
class Person_InitExample
{
private int _yearOfBirth;
public int YearOfBirth
{
get { return _yearOfBirth; }
init { _yearOfBirth = value; }
}
}
대체로 init
접근자는 앞의 예제와 마찬가지로 값을 할당하는 단일 명령문으로 구성됩니다. init
때문에 다음은 작동하지 않습니다:
var john = new Person_InitExample
{
YearOfBirth = 1984
};
john.YearOfBirth = 1926; //Not allowed, as its value can only be set once in the constructor
init
접근자는 호출자가 속성을 설정하도록 강제하지 않습니다. 대신 호출자가 나중에 수정하는 것을 금지하면서 개체 이니셜라이저를 사용할 수 있습니다. 호출자가 속성을 설정하도록 강제하기 위해 required
한정자를 추가할 수 있습니다. 다음 예에서는 지원 필드로 null 허용 값 형식이 있는 init
전용 속성을 보여 줍니다. 호출자가 YearOfBirth
속성을 초기화하지 않으면 해당 속성은 기본 null
값을 갖게 됩니다.
class Person_InitExampleNullability
{
private int? _yearOfBirth;
public int? YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
호출자가 null이 아닌 초기 값을 설정하도록 하려면 다음 예에 표시된 대로 required
한정자를 추가합니다.
class Person_InitExampleNonNull
{
private int _yearOfBirth;
public required int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
init
접근자는 식 본문 멤버로 사용될 수 있습니다. 예시:
class Person_InitExampleExpressionBodied
{
private int _yearOfBirth;
public int YearOfBirth
{
get => _yearOfBirth;
init => _yearOfBirth = value;
}
}
다음 코드 예에서 볼 수 있듯이 init
접근자는 자동 구현 속성에서도 사용할 수 있습니다.
class Person_InitExampleAutoProperty
{
public int YearOfBirth { get; init; }
}
다음 예제에서는 private set
, 읽기 전용 및 init
속성 간의 구분을 보여줍니다. 프라이빗 집합 버전과 읽기 전용 버전 모두 호출자가 추가된 생성자를 사용하여 이름 속성을 설정해야 합니다. private set
버전을 사용하면 인스턴스가 생성된 후 이름을 변경할 수 있습니다. init
버전에는 생성자가 필요하지 않습니다. 호출자는 개체 이니셜라이저를 사용하여 속성을 초기화할 수 있습니다.
class PersonPrivateSet
{
public string FirstName { get; private set; }
public string LastName { get; private set; }
public PersonPrivateSet(string first, string last) => (FirstName, LastName) = (first, last);
public void ChangeName(string first, string last) => (FirstName, LastName) = (first, last);
}
class PersonReadOnly
{
public string FirstName { get; }
public string LastName { get; }
public PersonReadOnly(string first, string last) => (FirstName, LastName) = (first, last);
}
class PersonInit
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
PersonPrivateSet personPrivateSet = new("Bill", "Gates");
PersonReadOnly personReadOnly = new("Bill", "Gates");
PersonInit personInit = new() { FirstName = "Bill", LastName = "Gates" };
C# 언어 사양
자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.
참고 항목
.NET