다음을 통해 공유


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

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

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

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

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

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

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# 컴파일러가 런타임에만 컴파일 시간에 정적 읽기 전용 필드의 값에 액세스할 수 없다는 점을 제외하고 상수와 유사합니다. 자세한 내용은 상수를 참조하세요.

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

required 수정자는 동일한 필드에서 readonly 수정자와 결합할 수 없습니다. 그러나 속성은 오직 requiredinit만 될 수 있습니다.

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

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용의 최종 소스입니다.

참고하십시오