정적 생성자(Static Constructor)
C#에서 static 키워드를 사용하여 정적으로 생성된 생성자를 정적 생성자라고 합니다. 정적 생성자는 클래스의 인스턴스(객체)가 몇 개나 생성되는지에 상관없이 클래스가 처음 로드될 때 한 번만 호출됩니다.
정적 생성자는 클래스의 정적 필드(static field)를 초기화하는데 사용되며, 정적 생성자 내부에서 특정 로직을 구현할 수 있습니다. 정적 생성자와 마찬가지로 정적 멤버는 클래스의 인스턴스가 몇 개나 생성되는지에 상관없이 한 번만 만들어집니다.
정적 생성자 특징
- 클래스에서 정적 생성자는 오직 한 개만 존재합니다.
- 정적 생성자는 매개변수가 없어야 합니다.
- 정적 생성자는 클래스의 정적 멤버에 접근할 수 있습니다.
- 정적 생성자에는 접근 지정자(접근 제한자)가 없어야 합니다.
- 정적 생성자는 클래스가 로드될 때 한 번만 호출됩니다.
정적 생성자 예제
다음은 정적 생성자 예제입니다.
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 |
댓글