반응형
http://cjh7163.blog.me/220444677611



일반적으로 생성자는 클래스의 인스턴스 필드를 초기화하려고 사용한다.
그렇다면 정적 생성자는 어떤 용도로 사용할까?

당연히 클래스의 정적 필드를 초기화할 때 사용한다. 아래의 예제를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
using System;
namespace _static_constructor
{
    class Student
    {
        static public int Id { get; private set; }
        public Student()
        {
            Console.WriteLine("Student ID + 1");
            ++Id;
        }
        static Student()
        {
            Console.WriteLine("Set Student ID : 0");
            Id = 0;
        }
    }
    class MyApplication
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Student ID : {0}", Student.Id);
            Student std1 = new Student();
            Student std2 = new Student();
            Console.WriteLine("Student ID : {0}", Student.Id);
        }
    }
}
 
cs

 


위의 소스코드를 보면 생성자가 두 가지가 있는데, 하나는 인스턴스 생성자이고 다른 하나는 정적 생성자이다.

코드는 어떤 동작을 하겠는가?


먼저 Student 클래스의 정적 필드 Id를 출력하고, 뒤에 Student 인스턴스를 두개 생성하여 인스턴스 생성자가 두번 호출되고

Id는 1씩 두번 증가하게 될 것이다. 그리고 마지막으로 Id를 출력한다.


인스턴스 생성자는 클래스 인스턴스가 생성될 때 호출된다. 그렇다면 정적 생성자는 언제 호출될까?


일단 프로그램을 먼저 실행해보겠다.




Student 클래스의 정적 필드 Id를 출력하기 전에 정적 생성자가 호출되어 "Set Student ID : 0" 문자열을 출력하는 것을 볼 수 있다. 그렇다면 프로그램이 시작되면 자동으로 정적 생성자가 호출되는 것일까?

메인 메소드의 가장 윗 부분에 "break"라는 문자열을 출력하도록 코드를 추가하였다.




정적 생성자가 "break" 문자열이 출력된 다음에 호출되었다. 그렇다면 프로그램이 시작되면 자동으로 호출되는 것은 아니라는 것이다. 그러면 무엇에 의하여 정적 생성자가 호출 되는 것일까? 메인 메소드만 떼어내서 올려보겠다.


 

1
2
3
4
5
6
7
8
        static void Main(string[] args)
        {
            Console.WriteLine("break");
            Console.WriteLine("Student ID : {0}", Student.Id); 00
            Student std1 = new Student();
            Student std2 = new Student();
            Console.WriteLine("Student ID : {0}", Student.Id);
        }
cs


3번줄과 4번줄 사이에서 정적생성자가 호출되었다. 3번줄은 단순히 문자열을 출력하는 문장이므로 정적 생성자 호출과 전혀 연관성이 없음을 알 수 있을 것이다. 4번줄을 살펴보자. 여기서 문자열에 클래스의 정적 필드를 출력하는 것을 확인할 수 있다. 

이것으로 정적필드에 접근하려고 하면 먼저 정적 생성자가 생성된다는 것을 알 수 있다.

위의 코드에서 4번줄을 지우면 아래와 같은 결과를 볼 수 있다.




정적 필드에 접근하려고 할 때 뿐만아니라 인스턴스를 생성할 때도 먼저 정적 생성자가 호출된 뒤 인스턴스 생성자가 호출되는 것을 볼 수 있다. 또, 정적 생성자는 클래스 당 단 한번만 호출된다.


정적 생성자(static constructor)에 대하여 정리하면 다음과 같다.


1) 클래스의 정적필드에 접근하기 직전에 호출된다.

2) 클래스의 인스턴스를 생성하기 직전에 호출된다.

3) 모든 클래스의 정적 생성자는 최초 한번만 호출된다.


반응형

+ Recent posts