static(C# 참조)static (C# Reference)

static 한정자를 사용하여 특정 개체가 아니라 형식 자체에 속하는 정적 멤버를 선언할 수 있습니다.Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object. static 한정자는 클래스, 필드, 메서드, 속성, 연산자, 이벤트 및 생성자와 함께 사용할 수 있지만 인덱서, 종료자 또는 클래스 이외의 형식에는 사용할 수 없습니다.The static modifier can be used with classes, fields, methods, properties, operators, events, and constructors, but it cannot be used with indexers, finalizers, or types other than classes. 자세한 내용은 static 클래스 및 static 클래스 멤버를 참조하세요.For more information, see Static Classes and Static Class Members.

Example

다음 클래스는 static으로 선언되며 static 메서드만 포함합니다.The following class is declared as static and contains only static methods:

static class CompanyEmployee
{
    public static void DoSomething() { /*...*/ }
    public static void DoSomethingElse() { /*...*/  }
}

상수 또는 형식 선언은 암시적으로 정적 멤버입니다.A constant or type declaration is implicitly a static member.

정적 멤버는 인스턴스를 통해 참조할 수 없습니다.A static member cannot be referenced through an instance. 대신, 형식 이름을 통해 참조됩니다.Instead, it is referenced through the type name. 예를 들어 다음 클래스를 예로 들어 볼 수 있습니다.For example, consider the following class:

public class MyBaseC
{
    public struct MyStruct
    {
        public static int x = 100;
    }
}

정적 멤버 x를 참조하려면 동일한 범위에서 멤버에 액세스할 수 없는 경우 정규화된 이름 MyBaseC.MyStruct.x를 사용합니다.To refer to the static member x, use the fully qualified name, MyBaseC.MyStruct.x, unless the member is accessible from the same scope:

Console.WriteLine(MyBaseC.MyStruct.x);  

클래스 인스턴스에는 클래스의 모든 인스턴스 필드에 대한 별도 복사본이 포함되지만 각 정적 필드의 복사본은 한 개만 있습니다.While an instance of a class contains a separate copy of all instance fields of the class, there is only one copy of each static field.

this를 사용하여 정적 메서드 또는 속성 접근자를 참조할 수 없습니다.It is not possible to use this to reference static methods or property accessors.

static 키워드가 클래스에 적용된 경우 클래스의 모든 멤버가 정적이어야 합니다.If the static keyword is applied to a class, all the members of the class must be static.

클래스 및 정적 클래스에 정적 생성자가 있을 수 있습니다.Classes and static classes may have static constructors. 프로그램이 시작된 후, 클래스가 인스턴스화되기 전에 정적 생성자가 호출됩니다.Static constructors are called at some point between when the program starts and the class is instantiated.

참고

static 키워드는 C++보다 사용이 제한적입니다.The static keyword has more limited uses than in C++. C++ 키워드와 비교하려면 저장소 클래스(C++)를 참조하세요.To compare with the C++ keyword, see Storage classes (C++).

정적 멤버를 보여 주려면 회사 직원을 나타내는 클래스를 고려해 보세요.To demonstrate static members, consider a class that represents a company employee. 클래스에 직원 수를 구하는 메서드와 직원 수를 저장하는 필드가 포함되어 있다고 가정합니다.Assume that the class contains a method to count employees and a field to store the number of employees. 메서드와 필드는 둘 다 인스턴스 직원에 속하지 않습니다.Both the method and the field do not belong to any instance employee. 대신 회사 클래스에 속해 있습니다.Instead they belong to the company class. 따라서 클래스의 정적 멤버로 선언해야 합니다.Therefore, they should be declared as static members of the class.

Example

이 예제에서는 새 직원의 이름 및 ID를 읽고, 직원 카운터를 1만큼 늘린 다음 새 직원에 대한 정보와 새 직원 수를 표시합니다.This example reads the name and ID of a new employee, increments the employee counter by one, and displays the information for the new employee and the new number of employees. 간단히 하기 위해 이 프로그램은 키보드에서 현재 직원 수를 읽습니다.For simplicity, this program reads the current number of employees from the keyboard. 실제 응용 프로그램에서는 이 정보를 파일에서 읽어야 합니다.In a real application, this information should be read from a file.

    public class Employee4
{
    public string id;
    public string name;

    public Employee4()
    {
    }

    public Employee4(string name, string id)
    {
        this.name = name;
        this.id = id;
    }

    public static int employeeCounter;

    public static int AddEmployee()
    {
        return ++employeeCounter;
    }
}

class MainClass : Employee4
{
    static void Main()
    {
        Console.Write("Enter the employee's name: ");
        string name = Console.ReadLine();
        Console.Write("Enter the employee's ID: ");
        string id = Console.ReadLine();

        // Create and configure the employee object:
        Employee4 e = new Employee4(name, id);
        Console.Write("Enter the current number of employees: ");
        string n = Console.ReadLine();
        Employee4.employeeCounter = Int32.Parse(n);
        Employee4.AddEmployee();

        // Display the new information:
        Console.WriteLine("Name: {0}", e.name);
        Console.WriteLine("ID:   {0}", e.id);
        Console.WriteLine("New Number of Employees: {0}",
                      Employee4.employeeCounter);
    }
}
    /*
    Input:
    Matthias Berndt
    AF643G
    15
     * 
    Sample Output:
    Enter the employee's name: Matthias Berndt
    Enter the employee's ID: AF643G
    Enter the current number of employees: 15
    Name: Matthias Berndt
    ID:   AF643G
    New Number of Employees: 16
    */

Example

이 예제에서는 아직 선언되지 않은 다른 정적 필드를 사용하여 정적 필드를 초기화할 수 있지만 정적 필드에 값을 명시적으로 할당할 때까지 결과가 정의되지 않음을 보여 줍니다.This example shows that although you can initialize a static field by using another static field not yet declared, the results will be undefined until you explicitly assign a value to the static field.

class Test
{
   static int x = y;
   static int y = 5;

   static void Main()
   {
      Console.WriteLine(Test.x);
      Console.WriteLine(Test.y);

      Test.x = 99;
      Console.WriteLine(Test.x);
   }
}
/*
Output:
    0
    5
    99
*/

C# 언어 사양C# Language Specification

자세한 내용은 C# 언어 사양을 참조하세요.For more information, see the C# Language Specification. C# 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.The language specification is the definitive source for C# syntax and usage.

참고 항목See Also

C# 참조C# Reference
C# 프로그래밍 가이드C# Programming Guide
C# 키워드C# Keywords
한정자Modifiers
정적 클래스 및 정적 클래스 멤버Static Classes and Static Class Members