[C#] 정적 속성 static

2023. 8. 19. 17:04공부/C#

 

static이란?

 

static은 정적, 움직이지 않는다는 뜻을 가진다. C#에서 말하는 static이란 메소드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자를 의미한다. 클래스의 인스턴스는 여러 개가 존재할 수 있지만 클래스는 단 한가지만이 존재한다. 따라서 클래스 자체에 소속된다면 그것은 프로그램 내에서 유일하게 존재한다는 뜻이 된다.

 

=> static 한정자를 사용한 대상은 프로그램 내에서 단 한 가지로만 존재할 수 있다.

 

 

 

예시를 살펴보자.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp_Project
{
    class CountA
    {
        public static int Count = 0;
    }

    class CountB
    {
        public CountB()
        {
            CountA.Count++;
            //생성자
        }
    }

    class CountC
    {
        public CountC()
        {
            CountA.Count++;
            //생성자
        }
    }

    class MainApp
    {
        static void Main()
        {
            Console.WriteLine($"CountA의 Count: {CountA.Count}");

            new CountB(); //생성자
            new CountC(); //생성자
            new CountB(); //생성자
            new CountC(); //생성자

            Console.WriteLine($"CountA의 Count: {CountA.Count}");
        }
    }
}

 

 

<실행 결과>

 

 

 

CountB, CountC의 객체를 여러번 생성해도 static으로 선언한 CountA.Count는 단 하나밖에 존재하지 않는다.

 

 

이처럼 static 필드는 프로그램 내에서 단 하나만 존재하기 때문에 프로그램 전체에 걸쳐 공유해야하는 변수는 static을 사용하여 선언하면 된다. (게임이라면 플레이어의 점수, 생명력 등)


 

 

다음 예시를 살펴보자.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp_Project
{
    class ClassA
    {
        public static void MethodA()
        {
            Console.WriteLine("스태틱 메소드 호출");
        }
        public void MethodB()
        {
            Console.WriteLine("일반 메소드 호출");
        }
    }

    class MainApp
    {
        public static void Main()
        {
            ClassA.MethodA(); //스태틱 메소드 호출

            ClassA classA = new ClassA();
            classA.MethodB(); //일반 메소드 호출

        }
    }
}

 

<실행결과>

 

 

static으로 선언한 정적 메소드는 인스턴스의 생성 없이 클래스의 이름만으로 바로 호출할 수 있다. (static으로 선언되었다면 해당 메소드는 프로그램 내에서 단 하나만 존재하기 때문)

 

 

인스턴스 내부에서 데이터를 이용해야한다면 인스턴스 메소드(static이 아닌 메소드)를 이용하고 인스턴스 내부의 데이터를 이용할 일이 없다면 인스턴스를 생성할 필요가 없는 정적 메소드 (static 메소드)를 선언하는 것이 좋다.