다음을 통해 공유


init 키워드(C# 참조)

init 키워드는 속성 또는 인덱스 작성기의 접근자 메서드를 정의합니다. init 전용 setter는 개체 생성 중에 속성 또는 인덱서 요소에 값을 할당합니다. init는 불변성을 적용하므로 개체가 초기화되면 변경할 수 없습니다. init 접근자를 사용하면 호출 코드에서 개체 이니셜라이저를 사용하여 초기 값을 설정할 수 있습니다. 반대로 setter만 get 있는 자동으로 구현된 속성은 생성자를 호출하여 초기화해야 합니다. private set 접근자가 있는 속성은 생성 후에 수정할 수 있지만 클래스에서만 가능합니다.

다음 코드는 자동으로 구현된 속성의 접근자를 보여 init 줍니다.

class Person_InitExampleAutoProperty
{
    public int YearOfBirth { get; init; }
}

매개 변수 유효성 검사를 제공하기 위해 접근자 중 하나를 구현해야 할 수 있습니다. C# 13에서 field 미리 보기 기능으로 도입된 키워드를 사용하여 이 작업을 수행할 수 있습니다. 키워드는 field 해당 속성에 대한 컴파일러 합성 지원 필드에 액세스합니다. 다음 예제에서는 접근자가 매개 변수 범위의 유효성을 검사하는 속성을 init 보여 줍니다 value ."

class Person_InitExampleFieldProperty
{
    public int YearOfBirth
    {
        get;
        init
        {
            field = (value <= DateTime.Now.Year)
                ? value
                : throw new ArgumentOutOfRangeException(nameof(value), "Year of birth can't be in the future");
        }
    }
}

Important

field 키워드는 C# 13의 미리 보기 기능입니다. 상황별 키워드를 사용하려면 .NET 9를 preview 사용하고 field 프로젝트 파일에서 요소를 설정 <LangVersion> 해야 합니다.

이름이 지정된 field필드가 field 있는 클래스에서 키워드 기능을 사용하는 데 주의해야 합니다. 새 field 키워드는 속성 접근자의 범위에 명명된 field 필드를 숨깁니다. 변수의 field 이름을 변경하거나 토큰을 사용하여 @ 식별자를 .로 @field참조 field 할 수 있습니다. 키워드에 대한 field 기능 사양을 읽어 자세히 알아볼 수 있습니다.

init 접근자는 식 본문 멤버로 사용될 수 있습니다. 예시:

class Person_InitExampleExpressionBodied
{
    private int _yearOfBirth;

    public int YearOfBirth
    {
        get => _yearOfBirth;
        init => _yearOfBirth = value;
    }
}

다음 예제에서는 YearOfBirth라는 속성의 getinit 접근자를 모두 정의합니다. _yearOfBirth라는 private 필드를 사용하여 속성 값을 지원합니다.

class Person_InitExample
{
     private int _yearOfBirth;

     public int YearOfBirth
     {
         get { return _yearOfBirth; }
         init { _yearOfBirth = value; }
     }
}

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;
    }
}

다음 예제에서는 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# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.

참고 항목