VisualStudio/C#

[C#] static 변수, 클래스, 메소드

usingsystem 2022. 8. 10. 12:14
728x90

데이터 영역

-전역변수와 static변수가 할당되는 영역.

-프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야만 메모리에서 소멸.

스택 영역

-함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역.

-함수 호출이 완료되면 소멸.

-늦게 할당된 변수의 메모리가 먼저 해제.

힙 영역

-프로그래머가 관리하는 메모리 영역.

-동적 할당으로 생성되는 메모리 영역.

 

static 변수는 객체를 선언만 해도 메모리가 할당되며 해당 객체를 계속 반복적으로 생성해도 그 메모리는 유지가 됨.

일반적인 변수들이 객체가 새로 생성될 때 메모리가 초기화 되는 것과는 다른 점.

프로그램 로딩시 단 한 번 클래스 내에 생성되고 동일 메모리를 계속 사용.

   public class MyClass
    {
        private static int staticNum = 0;
        private int num = 0;

        public StaticTest()
        {
            staticNum++;
            num++;
        }

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

    public static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            StaticTest st = new StaticTest();
            st.ShowMe();
        }
    }

 

실행결과

staticNum : 1, num : 1

staticNum : 2, num : 1

staticNum : 3, num : 1

staticNum : 4, num : 1

staticNum : 5, num : 1

 

static 메소드는 객체가 메모리를 할당 받기 전에 호출이 되기 때문에 객체 생성 후 메모리 할당을 받는 일반 변수에는 접근이 불가능.

인스턴스 메소드와는 달리 클래스로부터 객체를 생성하지 않고 클래스명.메소드명 형식으로 호출하는 메소드이다.

메소드 내부에서 클래스 인스턴스 객체멤버를 참조해서는 안된다.

인스턴스 객체로부터 호출될 수 없으며, 반드시 클래스명과 함께 사용된다.

public class MyClass
    {
        public int InstMethod()
        {
            return 1;
        }

        public static int StaticMethod()
        {
            return 1;
        }
    }

    public class MySecondClass
    {
        public void StaticTest()
        {
            MyClass mc = new MyClass();
            int a = mc.InstMethod();
            int b = MyClass.StaticMethod();
        }
    }

static 클래스는 모든 클래스 멤버가 static 멤버로 되어 있으며, public생성자를 가질 수 없지만(객체를 생성할 수 없으므로), static 생성자를 가질 수 있다.

이 static생성자는 주로 static 필드들을 초기화 할 때 사용한다.

 

 

출처: https://ssscool.tistory.com/12 [시작:티스토리]

728x90