공부/C#

[C#]static(정적) 필드, 메소드

개발의 피 2023. 11. 12. 20:37

- 사전적 정의 : '정적' = 움직이지 않는다

-> 메소드/필드(=변수)가 클래스의 인스턴스가 아닌, 클래스 자체에 소속되도록 지정하는 한정자

=> 정적 메소드 : 클래스의 인스턴스를 만들지 않고도 호출 가능

 

- static으로 한정한 필드 : 클래스에 소속 = 인스턴스를 만들지 않고, 필드(변수)에 직접 접근

- static으로 한정하지 않은 필드 : 자동으로 인스턴스에 소속 = 인스턴스를 만들어, 인스턴스에 접근

 

- 한 프로그램 : 인스턴스 - 여러 개 존재 가능, 클래스 - 단 하나만 존재

-> 어떤 필드가 클래스에 소속된다 = 그 필드가 프로그램 전체에서 유일하게 존재

=> 정적 필드의 이득 : 프로그램 전체에 걸쳐 공유해야 하는 변수 선언할 때!

 

cf. 비정적 메소드 = 인스턴스에 소속 -> 인스턴스 메소드 : 인스턴스를 생성해야만 호출할 수 있는 메소드

+)

인스턴스 메소드 : 객체 내부 데이터를 이용해야 하는 경우

정적 메소드 : 내부 데이터를 이용할 일이 없는 경우

using System;

class Global
{
    public static int Count = 0; // 정적 필드 Count 선언 
}

class ClassA
{
    public ClassA() 
    {
        Global.Count++; // Global 클래스의 Count 필드 ++ (정적 메소드 = 인스턴스 만들지 않고, 바로 호출 가능)
    }
}

class ClassB
{
    public ClassB()
    {
        Global.Count++; // // Global 클래스의 Count 필드 ++ 
    }
}

class ClassC
{
    public int InstanceCount = 0; // 인스턴스 필드 

    public void InstanceMethod() // 인스턴스 메소드 
    {
        InstanceCount++;
    }
}

class MainApp
{
    static void Main()
    {
        // 정적 메소드 : 클래스의 인스턴스 생성하지 않아도 호출 가능 
        Console.WriteLine($"Global.Count : {Global.Count}"); // 0

        new ClassA(); // +1 
        new ClassB(); // +1

        Console.WriteLine($"Global.Count : {Global.Count}"); // 2

        // 인스턴스 메소드 : 인스턴스를 만들어야 호출 가능
        ClassC instance = new ClassC(); // ClassC의 인스턴스 생성 
        Console.WriteLine($"InstanceCount : {instance.InstanceCount}"); // 0
        instance.InstanceMethod(); // ClassC의 인스턴스 메소드 호출  /
        Console.WriteLine($"InstanceCount : {instance.InstanceCount}"); // 1
    }
}