본문 바로가기

C#

[C# Study] Static 정적

Static이란?

  • C#에서 static은 메서드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자.
  • static 필드는 객체 선언과 동기에 메모리가 할당되며 해당 클래스가 처음 사용될 때 한번 초기화되어 계속 동일한 메모리를 사용함. (일반적인 필드들이 객체가 새로 생성될 때 메모리가 초기화되는 것과는 다름)

예제 1

namespace Static
{
    public class StaticTest
    {
        public static int staticNum = 0;
        public int num = 0;
        public StaticTest() //생성자
        {
            staticNum++;
            num++;
        }

        public void ShowMe()
        {
            Console.WriteLine($"StaticNum : {staticNum}, num : {num}");
        }

        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                StaticTest st = new StaticTest();
                st.ShowMe();
            }
        }
    }
}

 

 

출력값 비교

일반 필드인 num은 계속 초기화되어서 1을 반환하고 static 필드 staticNum은 메모리가 초기화되지 않고 계속 더해짐.

 

 

예제 2

namespace Static
{
    public class Program
    {
        static void Main(string[] args)
        {
            Car.Sonata(); //Static(정적) 메소드는 인스턴스를 만들지 않고 바로 호출 가능

            Car car = new Car(); //Static( 정적) 메소드가 아니면 인스턴스를 만들어야 함.
            car.Genesis();
        }

        public class Car
        {
            int speed = 0;
            static int km = 0;

            public static void Sonata()
            {
                speed = 100; //Sonata매서드는 이미 static 메모리에 올라갔는데 speed는 new 생성자를 사용하기 전에 안올라가기 때문에 오류가 남.
                km = 10000;  //static 키워드가 붙은 함수나 클래스에서는 static 키워드가 붙은 것들 끼리만 참조가능       
            }

            public void Genesis()
            {
                speed = 200;
                km = 20000;
            }
        }
        //내부데이터를 이용할 일이 있는 경우 인스턴스 메소드 사용
        //내부테이터를 이용할 일이 없는경우 정적 메소드 사용 
    }
}

 

클래스에 소속된 필드(static) : static int km
인스턴스에 소속된 필드 : int speed

Static(정적) 메서드 Sonata()는 클래스의 이름을 통해 인스턴스를 만들지 않고 직접 필드에 접근 가능함.

Car.Sonata()

 

인스턴스 메서드인 Genesis()는 인스턴스를 만들어야 필드에 접근 가능함.
Car car = new Car()

car.Genisis();

 

speed 변수 오류확인

 

정적 메소드인 Sonata()의 speed 필드가 오류가 나는 것은 아직 인스턴스가 만들어지지 않았기 때문
(결과적으로 static 키워드가 붙은 매서드나 클래스에서는 static 키워드가 붙은 것들끼리만 참조가 가능함)

그렇다면 static 은 언제 사용해야 하는지?

static 필드는 사용을 하던 안 하던 프로그램의 시작과 끝까지 메모리에 할당되어 있어서 메모리에 악영향을 줄 수 있음.(가비지 컬렉터가 회수하지 않음)
하지만 그렇다고 static이 무조건 나쁜 것은 아니고 프로그램 전체에 걸쳐서 공유해야 하는 필드가 있다면 static을 이용

 

 

 


참고 

'C#' 카테고리의 다른 글

[C# Study] 용어 정리중...  (0) 2022.08.25
[C# Study] 메서드(method)  (0) 2022.08.24
[C# Study] 생성자(Constructor)  (0) 2022.08.23