C#

[C#]정적 생성자(Static Constructor)

DevStory 2022. 5. 5.

정적 생성자(Static Constructor)

C#에서 static 키워드를 사용하여 정적으로 생성된 생성자를 정적 생성자라고 합니다. 정적 생성자는 클래스의 인스턴스(객체)가 몇 개나 생성되는지에 상관없이 클래스가 처음 로드될 때 한 번만 호출됩니다.

 

정적 생성자는 클래스의 정적 필드(static field)를 초기화하는데 사용되며, 정적 생성자 내부에서 특정 로직을 구현할 수 있습니다. 정적 생성자와 마찬가지로 정적 멤버는 클래스의 인스턴스가 몇 개나 생성되는지에 상관없이 한 번만 만들어집니다.


정적 생성자 특징

  1. 클래스에서 정적 생성자는 오직 한 개만 존재합니다.
  2. 정적 생성자는 매개변수가 없어야 합니다.
  3. 정적 생성자는 클래스의 정적 멤버에 접근할 수 있습니다.
  4. 정적 생성자에는 접근 지정자(접근 제한자)가 없어야 합니다.
  5. 정적 생성자는 클래스가 로드될 때 한 번만 호출됩니다.

정적 생성자 예제

다음은 정적 생성자 예제입니다. 

class Person
{
  public static int num { get; set; }

  public Person()
  {
    Console.WriteLine("기본 생성자 호출!");
  }

  static Person()
  {
    Console.WriteLine("정적 생성자 호출!");
    Person.num = 10;
    Console.WriteLine("num: " + num);
  }
}

class Program
{
  static void Main(string[] args)
  {
    Console.WriteLine(Person.num);
    Console.WriteLine(Person.num);
  }
}

실행 결과

정적 생성자 호출!
num: 10
10
10

위 예제는 정적 생성자에서 정적 필드인 num의 값을 10으로 초기화합니다. 정적 멤버는 클래스 객체 생성 없이 접근 가능하며, 정적 생성자가 한 번만 호출된 것을 확인할 수 있습니다.

 

정적 클래스에 대해 좀 더 알아봅시다. 다음은 Person 클래스를 사용하지 않는 예제입니다.

class Person
{
  public static int staticFieldNum { get; set; }

  public Person()
  {
    Console.WriteLine("기본 생성자 호출!");
  }

  static Person()
  {
    Console.WriteLine("정적 생성자 호출!");
    Person.staticFieldNum = 10;
    Console.WriteLine("staticFieldNum: " + staticFieldNum);
  }
}

class Program
{
  static void Main(string[] args)
  {
    Console.WriteLine("Hello!");
  }
}

실행 결과

Hello!

위 예제는 Main문에서 Person 클래스의 정적 멤버를 접근하거나 객체를 생성하지 않았으므로 Person 클래스가 로드되지 않습니다. 그러므로 정적 생성자가 호출되지 않습니다.

 

다음은 3개의 Person 클래스를 생성하는 예제입니다.

class Person
{
  public static int staticFieldNum { get; set; }

  public Person()
  {
    Console.WriteLine("기본 생성자 호출!");
  }

  static Person()
  {
    Console.WriteLine("정적 생성자 호출!");
    Person.staticFieldNum = 10;
    Console.WriteLine("staticFieldNum: " + staticFieldNum);
  }
}

class Program
{
  static void Main(string[] args)
  {
    Person person1 = new Person();
    Person person2 = new Person();
    Person person3 = new Person();
  }
}

실행 결과

정적 생성자 호출!
staticFieldNum: 10
기본 생성자 호출!
기본 생성자 호출!
기본 생성자 호출!

정적 생성자가 먼저 호출되었으며, 기본 생성자는 객체마다 호출되었습니다. 위 예제를 통해 정적 생성자는 클래스의 인스턴스 개수와 상관없이 한 번만 호출된다는 것을 알 수 있습니다.

 

결론적으로 정적 생성자는 클래스의 정적 멤버를 초기화하거나 프로그램에서 클래스가 로드될 때 특정 작업을 한 번만 수행해야 하는 경우 사용됩니다. 클래스의 객체를 생성하는 경우 정적 생성자는 기본 생성자보다 먼저 호출됩니다. 

반응형

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

[C#]this 키워드  (0) 2022.05.09
[C#]접근 제한자(Access Modifier) - public, private, protected  (0) 2022.05.08
[C#]복사 생성자(Copy Constructor)  (0) 2022.05.05
[C#]생성자(Constructor)  (0) 2022.05.05
[C#]소멸자(destructor)  (0) 2022.05.02

댓글