static(C# 참조)
static 한정자는 특정 개체가 아니라 해당 형식 자체에 속하는 정적 멤버를 선언하는 데 사용됩니다. static 한정자는 클래스, 필드, 메서드, 속성, 연산자, 이벤트 및 생성자와 함께 사용할 수 있지만 클래스 이외의 형식, 소멸자 또는 인덱서와 함께 사용할 수는 없습니다. 예를 들어, 다음 클래스는 static으로 선언되며 static 메서드만 포함합니다.
static class CompanyEmployee
{
public static string GetCompanyName(string name) { ... }
public static string GetCompanyAddress(string address) { ... }
}
자세한 내용은 정적 클래스 및 정적 클래스 멤버(C# 프로그래밍 가이드)를 참조하십시오.
설명
상수 또는 형식 선언은 암시적으로 정적 멤버입니다.
정적 멤버는 인스턴스를 통해 참조할 수 없으며 대신 형식 이름을 통해 참조됩니다. 예를 들어, 다음 클래스를 확인해 보십시오.
public class MyBaseC { public struct MyStruct { public static int x = 100; } }
정적 멤버
x
를 참조하려면 정규화된 이름을 사용합니다(동일한 범위에서 액세스 가능하지 않은 경우).MyBaseC.MyStruct.x
클래스의 인스턴스에는 해당 클래스의 모든 인스턴스 필드에 대한 별도의 복사본이 포함되지만 각 정적 필드의 복사본은 한 개만 있습니다.
this를 사용하여 정적 멤버 또는 속성 접근자를 참조할 수 없습니다.
클래스에 static 키워드가 적용되면 해당 클래스의 모든 멤버가 정적 멤버여야 합니다.
정적 클래스를 비롯한 클래스는 정적 생성자를 가질 수 있습니다. 정적 생성자는 프로그램이 시작된 후 클래스가 인스턴스되기 전에 호출됩니다.
참고
static 키워드는 C++에서보다 제한적으로 사용됩니다. C++ 키워드와 비교하려면 static을 참조하십시오.
정적 멤버를 설명하기 위해 회사의 직원을 나타내는 클래스가 있다고 가정합니다. 또한 이 클래스에 직원 수를 계산하는 메서드와 직원 수를 저장하기 위한 필드가 포함되어 있다고 가정합니다. 이 메서드와 필드는 모두 어떤 인스턴스 직원에도 속해 있지 않으며 대신 회사 클래스에 속해 있습니다. 따라서 이 메서드 및 필드는 해당 클래스의 정적 멤버로 선언되어야 합니다.
예제
이 예제에서는 새 직원의 이름 및 ID를 읽고 직원 카운터를 1씩 증가시키고 새로운 직원 수와 새 직원에 대한 정보를 표시합니다. 간단하게 설명하기 위해 이 프로그램은 키보드를 통해 직원의 현재 수를 읽어 들입니다. 실제 응용 프로그램에서는 이 정보를 파일에서 읽어 들입니다.
// cs_static_keyword.cs
using System;
public class Employee
{
public string id;
public string name;
public Employee()
{
}
public Employee(string name, string id)
{
this.name = name;
this.id = id;
}
public static int employeeCounter;
public static int AddEmployee()
{
return ++employeeCounter;
}
}
class MainClass : Employee
{
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:
Employee e = new Employee(name, id);
Console.Write("Enter the current number of employees: ");
string n = Console.ReadLine();
Employee.employeeCounter = Int32.Parse(n);
Employee.AddEmployee();
// Display the new information:
Console.WriteLine("Name: {0}", e.name);
Console.WriteLine("ID: {0}", e.id);
Console.WriteLine("New Number of Employees: {0}",
Employee.employeeCounter);
}
}
입력
Tara Strahan AF643G 15
샘플 출력
Enter the employee's name: Tara Strahan Enter the employee's ID: AF643G Enter the current number of employees: 15 Name: Tara Strahan ID: AF643G New Number of Employees: 16
이 예제에서는 정적 필드를 아직 정의되지 않은 다른 정적 필드로 초기화할 수 있지만 그 결과는 정적 필드에 명시적으로 값을 할당하기 전까지 정의되지 않은 상태임을 보여 줍니다.
// cs_static_keyword_2.cs
using System;
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);
}
}
출력
0 5 99
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 단원을 참조하십시오.
1.6.5.3 정적 및 인스턴스 메서드
5.1.1 정적 변수
10.2.5 정적 및 인스턴스 멤버
10.4.1 정적 및 인스턴스 필드
10.4.5.1 정적 필드 초기화
10.5.2 정적 및 인스턴스 메서드
10.6.1 정적 및 인스턴스 속성
10.7.3 정적 및 인스턴스 이벤트
10.11 정적 생성자
참고 항목
참조
C# 키워드
한정자(C# 참조)
정적 클래스 및 정적 클래스 멤버(C# 프로그래밍 가이드)