English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 정적 클래스, 메서드, 생성자, 필드

C#에서 정적은 인스턴스화할 수 없는 내용을 의미합니다. 정적 클래스의 객체를 생성할 수 없으며, 객체를 사용하여 정적 멤버에 접근할 수 없습니다.

클래스, 변수, 메서드, 속성, 연산자, 이벤트 및 생성자는 static 키워드 키워드를 사용하여 정적으로 정의할 수 있습니다.

정적 클래스

클래스 이름 앞과 접근 지정자 뒤에 static 지정자를 적용하여 클래스를 정적으로 만듭니다. 아래는 정적 필드와 메서드를 가진 정적 클래스를 정의한 예입니다.

public static class Calculator
{
    private static int _resultStorage = 0;
    
    public static string Type = "Arithmetic";
    public static int Sum(int num1, int num2)
    {
        return num1 + num2;
    }
    public static void Store(int result)
    {
        _resultStorage = result;
    }
}

위의 Calculator 클래스는 정적입니다. 모든 멤버도 정적입니다.

스태틱 클래스의 객체를 생성할 수 없으므로, ClassName.MemberName를 사용하여 직접 스타틱 클래스의 멤버에 접근할 수 있습니다. 예를 들어 다음과 같이 합니다.

class Program
{
    static void Main(string[] args)
    {
        var result = Calculator.Sum(10, 25); //정적 메서드 호출
        Calculator.Store(result); 
        var calcType = Calculator.Type; // 접근 정적 변수
        Calculator.Type = "Scientific"; // 정적 변수에 값을 할당하세요
    }
}

정적 클래스 규칙

  1. 정적 클래스는 인스턴스화할 수 없습니다.

  2. 정적 클래스의 모든 멤버는 정적이어야 합니다. 그렇지 않으면 컴파일러는 오류를 발생시킵니다.

  3. 정적 클래스는 정적 변수, 정적 메서드, 정적 속성, 정적 연산자, 정적 이벤트 및 정적 생성자를 포함할 수 있습니다.

  4. 정적 클래스는 인스턴스 멤버와 생성자를 포함할 수 없습니다.

  5. 인덱서와 디스트럭터는 정적일 수 없습니다.

  6. var는 정적 멤버를 정의하는 데 사용할 수 없습니다. static 키워드 뒤에 명시적으로 멤버 타입을 지정해야 합니다.

  7. 정적 클래스는 쉐이프드 클래스이므로 상속할 수 없습니다.

  8. 정적 클래스는 다른 클래스에서 상속할 수 없습니다.

  9. ClassName.MemberName(즉: 클래스 이름.멤버 이름)를 사용하여 정적 클래스 멤버에 접근할 수 있습니다.

  10. 정적 클래스는 프로그램이 실행되는 애플리케이션 도메인의 전체 라이프사이클 동안 메모리에 남아 있습니다.

비정적 클래스의 정적 멤버

일반 클래스(비정적 클래스)는 하나 이상의 정적 메서드, 필드, 속성, 이벤트 및 다른 비정적 멤버를 포함할 수 있습니다.

전체 클래스를 정적 클래스로 선언하는 대신 몇 가지 정적 멤버를 정의하는 것이 실용적입니다.

정적 필드

static 키워드를 사용하여 비정적 클래스에서 정적 필드를 정의할 수 있습니다.

비정적 클래스의 정적 필드는 모든 인스턴스 간에 공유됩니다. 따라서 하나의 인스턴스에서 이루어진 변경은 다른 인스턴스에 반영됩니다.

public class StopWatch
{
    public static int InstanceCounter = 0;
    // 인스턴스 생성자
    public StopWatch()
    {
    }
}
class Program
{
    static void Main(string[] args)
    {
        StopWatch sw1 = new StopWatch();
        StopWatch sw2 = new StopWatch();
        Console.WriteLine(StopWatch.NoOfInstances); //2 
        StopWatch sw3 = new StopWatch();
        StopWatch sw4 = new StopWatch();
        Console.WriteLine(StopWatch.NoOfInstances);//4
    }
}

정적 메서드

비정적 클래스에서는 하나 이상의 정적 메서드를 정의할 수 있습니다. 정적 메서드는 객체를 생성하지 않고 호출할 수 있습니다. 비정적 클래스의 객체를 사용하여 정적 메서드를 호출할 수 없습니다.

정적 메서드는 다른 정적 메서드를 호출하고 정적 멤버에 접근할 수 있습니다. 정적 메서드에서 클래스의 비정적 멤버에 접근할 수 없습니다.

class Program
{
    static int counter = 0;
    string name = "Demo Program";
    static void Main(string[] args)
    {
        counter++; // 비정적 필드 접근 가능
        Display("Hello World!"); // 비정적 메서드 호출 가능
        name = "New Demo Program"; //오류: 비정적 멤버 접근 불가
        SetRootFolder("C:\MyProgram"); //오류: 비정적 메서드 호출 불가
    }
    static void Display(string text)
    {
        Console.WriteLine(text);
    }
    public void SetRootFolder(string path) { }
}

정적 메서드 규칙

  1. 정적 메서드는 반환 타입 앞에 static 키워드를 사용하여 정의할 수 있으며, 접근 제어자 이후에 정의할 수 있습니다.

  2. 정적 메서드는 오버로드할 수 있지만, 오버라이드할 수 없습니다.

  3. 정적 메서드는 전역 정적 변수를 포함할 수 있습니다.

  4. 정적 메서드는 비정적 변수에 접근하거나 호출할 수 없으며, 명시적으로 파라미터로 전달하지 않으면 됩니다.

정적 생성자

비정적 클래스는 파라미터 없는 정적 생성자를 포함할 수 있습니다. static 키워드로 정의할 수 있으며, 접근 제어자(예: public, private, protected)를 사용하지 않습니다.

아래 예제에서 정적 생성자와 인스턴스 생성자 간의 차이를 보여줍니다.

public class StopWatch
{
    // 정적 생성자
    static StopWatch()
    {
        Console.WriteLine("정적 생성자 호출됨");
    }
    // 인스턴스 생성자
    public StopWatch()
    {
        Console.WriteLine("인스턴스 생성자 호출됨");
    }
    // 정적 메서드
    public static void DisplayInfo()
    {
        Console.WriteLine("DisplayInfo 호출됨");
    }
    // 인스턴스 메서드
    public void Start() { }
    // 인스턴스 메서드
    public void Stop() { }
}

위의 비정적 클래스 StopWatch는 정적 생성자를 포함하고 있으며, 비정적 생성자도 포함하고 있습니다.

정적 메서드나 인스턴스를 최초로 생성할 때마다 정적 생성자는 단 한 번만 호출됩니다. 아래 예제에서는 최초로 static 메서드를 호출할 때 정적 생성자가 호출되고, 두 번째로 static 메서드를 호출할 때는 정적 생성자가 호출되지 않습니다.

StopWatch.DisplayInfo(); // 여기서 정적 생성자 호출
StopWatch.DisplayInfo(); // 여기서 생성자가 호출되지 않음
출력:
정적 생성자가 호출됨
DisplayInfo 호출됨
DisplayInfo 호출됨

아래 예제에서는 인스턴스를 최초로 생성할 때 정적 생성자가 호출된다고 보여줍니다.

StopWatch sw1 = new StopWatch(); // 먼저 정적 생성자가 호출되고, 그 다음 인스턴스 생성자가 호출됩니다. 
StopWatch sw2 = new StopWatch();// 인스턴스 생성자 만 호출됨 
StopWatch.DisplayInfo();
출력:
정적 생성자 호출됨
인스턴스 생성자 호출됨
인스턴스 생성자 호출됨
DisplayInfo 호출됨

정적 생성자 규칙

  1. 정적 생성자는 static 키워드로 정의된 것으로, public, private 또는 protected와 같은 접근 제어자를 사용하지 않습니다.

  2. 비정적 클래스는 파라미터가 없는 정적 생성자를 포함할 수 있습니다. 파라미터화된 정적 생성자의 사용은 허용되지 않습니다.

  3. 정적 생성자는 라이프 사이클 내에 한 번만 실행됩니다. 따라서, 여러 곳에서 클래스를 사용하는 경우, 클래스가 어디서应用程序에서 호출되는지를 결정할 수 없습니다.

  4. 정적 생성자는 정적 멤버 만 접근할 수 있습니다. 그것은 인스턴스 멤버를 포함하거나 접근할 수 없습니다.

정적 멤버는 메모리의 특별한 영역인 '고주파 스택'에 저장됩니다. 정적 클래스의 정적 멤버는 해당 클래스의 모든 인스턴스 간에 공유됩니다. 따라서, 하나의 인스턴스에서 이루어진 변경사항은 모든 다른 인스턴스에 반영됩니다.