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

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

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

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

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

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

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";
    //...
}

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

참고

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

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

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

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

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

required 한정자를 동일한 필드의 한정자와 readonly 결합할 수 없습니다.

C# 언어 사양

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

참고 항목