필드(C# 프로그래밍 가이드)

필드클래스 또는 구조체에서 직접 선언되는 모든 형식의 변수입니다. 필드는 포함하는 형식의 멤버입니다.

클래스 또는 구조체에는 인스턴스 필드, 정적 필드 또는 둘 다 있을 수 있습니다. 인스턴스 필드는 형식의 인스턴스와 관련이 있습니다. 인스턴스 필드F가 있는 클래스T가 있는 경우 형식T의 두 개체를 만들고 다른 개체의 값에 영향을 주지 않고 각 개체의 F 값을 수정할 수 있습니다. 반면 정적 필드는 형식 자체에 속하며 해당 형식의 모든 인스턴스에서 공유됩니다. 형식 이름만 사용하여 정적 필드에 액세스할 수 있습니다. 인스턴스 이름으로 정적 필드에 액세스 하는 경우 CS0176 컴파일 시간 오류가 발생합니다.

일반적으로 필드에 대해 선언 private 하거나 protected 접근성을 선언해야 합니다. 형식에서 클라이언트 코드에 노출하는 데이터는 메서드, 속성, 인덱서를 통해 제공해야 합니다. 내부 필드에 직접 액세스하는 데 이러한 구문을 사용하면 잘못된 입력 값으로부터 보호할 수 있습니다. 공용 속성에 의해 노출된 데이터를 저장하는 private 필드는 백업 저장소 또는 지원 필드라고 합니다. 필드를 선언 public 할 수 있지만 형식을 사용하는 코드가 해당 필드를 잘못된 값으로 설정하거나 개체의 데이터를 변경하는 것을 방지할 수 없습니다.

필드는 일반적으로 둘 이상의 형식 메서드에서 액세스할 수 있고 단일 메서드의 수명보다 오랫동안 저장되어야 하는 데이터를 저장합니다. 예를 들어 달력 날짜를 나타내는 형식에는 각각 월, 일, 연도에 대한 세 개의 정수 필드가 있을 수 있습니다. 단일 메서드의 범위 외부에서 사용되지 않는 변수는 메서드 본문 자체 내에서 지역 변수선언되어야 합니다.

필드가 클래스 또는 구조체 블록에서 액세스 수준을 지정하고 그 뒤에 형식을 지정한 다음 필드 이름을 지정하여 선언됩니다. 예시:

public class CalendarEntry
{

    // private field (Located near wrapping "Date" property).
    private DateTime _date;

    // Public property exposes _date field safely.
    public DateTime Date
    {
        get
        {
            return _date;
        }
        set
        {
            // Set some reasonable boundaries for likely birth dates.
            if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
            {
                _date = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("Date");
            }
        }
    }

    // public field (Generally not recommended).
    public string? Day;

    // Public method also exposes _date field safely.
    // Example call: birthday.SetDate("1975, 6, 30");
    public void SetDate(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        // Set some reasonable boundaries for likely birth dates.
        if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
        {
            _date = dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }

    public TimeSpan GetTimeSpan(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt.Ticks < _date.Ticks)
        {
            return _date - dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }
}

인스턴스의 필드에 액세스하려면 인스턴스 이름 뒤에 마침표를 추가하고 그 뒤에 필드 이름을 추가합니다(예: instancename._fieldName). 예시:

CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";

필드를 선언할 때 대입 연산자를 사용하여 필드에 초기 값을 지정할 수 있습니다. 예를 들어 Day 필드를 "Monday"에 자동으로 할당하려면 다음 예제와 같이 Day를 선언합니다.

public class CalendarDateWithInitialization
{
    public string Day = "Monday";
    //...
}

필드는 개체 인스턴스에 대한 생성자를 호출 하기 직전에 초기화됩니다. 생성자가 필드 값을 할당하는 경우 필드 선언 중에 지정된 값을 덮어씁니다. 자세한 내용은 생성자 사용을 참조하세요.

참고 항목

필드 이니셜라이저는 다른 인스턴스 필드를 참조할 수 없습니다.

필드는 , , private, protected internalprotectedinternal또는 private protected.로 public표시될 수 있습니다. 이러한 액세스 한정자는 형식의 사용자가 필드에 액세스하는 방법을 정의합니다. 자세한 내용은 액세스 한정자를 참조하세요.

필요에 따라 필드를 선언 static할 수 있습니다. 정적 필드는 형식의 인스턴스가 없더라도 언제든지 호출자가 사용할 수 있습니다. 자세한 내용은 static 클래스 및 static 클래스 멤버를 참조하세요.

필드를 선언 readonly할 수 있습니다. 읽기 전용 필드는 초기화 중이나 생성자에서만 값을 할당할 수 있습니다. static readonly 필드는 C# 컴파일러가 런타임에만 컴파일 시간에 정적 읽기 전용 필드의 값에 액세스할 수 없다는 점을 제외하고 상수와 유사합니다. 자세한 내용은 상수를 참조하세요.

필드를 선언 required할 수 있습니다. 필수 필드는 생성자 또는 개체를 만들 때 개체 이니셜라이저에 의해 초기화되어야 합니다. 모든 필수 멤버를 초기화하는 모든 생성자 선언에 특성을 추가 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 합니다.

required 한정자는 동일한 필드의 한정자와 결합 readonly 할 수 없습니다. 그러나 속성단지 될 requiredinit 수 있습니다.

C# 12 부터 기본 생성자 매개 변수는 필드를 선언하는 대안입니다. 형식에 초기화 시 제공해야 하는 종속성이 있는 경우 해당 종속성을 제공하는 기본 생성자를 만들 수 있습니다. 이러한 매개 변수는 형식에서 선언된 필드 대신 캡처되고 사용될 수 있습니다. 형식의 record 경우 기본 생성자 매개 변수는 public 속성으로 표시됩니다.

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.

참고 항목