C#에서 생성자는 크게 정적 생성자(Static Constructor)와 인스턴스 생성자(Instance Constructor) 두 가지로 나눌 수 있습니다. 두 생성자는 호출 시점과 역할이 완전히 다르기 때문에, 이 차이를 정확히 이해하는 것이 중요합니다.
정적 생성자(Static Constructor)란?
정적 생성자는 static 한정자를 사용하여 선언한 생성자입니다. 클래스에 처음 접근하는 시점에 단 한 번만 실행되며, 클래스의 전체 수명 주기 동안 다시 호출되지 않습니다. 주로 정적 필드를 초기화하거나 클래스 수준의 초기화 작업을 수행할 때 사용됩니다.
정적 생성자의 특징은 다음과 같습니다.
- 접근 제한자(public, private 등)를 사용할 수 없습니다.
- 매개변수를 가질 수 없으므로 오버로딩이 불가능합니다.
- 개발자가 직접 호출할 수 없으며, CLR(공용 언어 런타임)이 자동으로 호출합니다.
인스턴스 생성자(Instance Constructor)란?
인스턴스 생성자는 객체의 인스턴스 데이터를 초기화하는 생성자입니다. new 키워드로 클래스의 객체를 생성할 때마다 호출되며, 하나의 클래스에 여러 개의 인스턴스 생성자를 오버로딩하여 정의할 수 있습니다.
아래 예제를 통해 정적 생성자와 인스턴스 생성자의 차이를 확인해 보겠습니다.
예제 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Difference {
class Demo {
static int val1;
int val2;
// 정적 생성자
static Demo() {
Console.WriteLine("This is Static Constructor");
val1 = 70;
}
// 인스턴스 생성자
public Demo(int val3) {
Console.WriteLine("This is Instance Constructor");
val2 = val3;
}
private void show() {
Console.WriteLine("First Value = " + val1);
Console.WriteLine("Second Value = " + val2);
}
static void Main(string[] args) {
Demo d1 = new Demo(110);
Demo d2 = new Demo(200);
d1.show();
d2.show();
Console.ReadKey();
}
}
}
실행 결과
This is Static Constructor This is Instance Constructor This is Instance Constructor First Value = 70 Second Value = 110 First Value = 70 Second Value = 200
결과 분석
실행 결과를 보면 알 수 있듯이, "This is Static Constructor" 메시지는 단 한 번만 출력됩니다. 이는 첫 번째 객체 d1이 생성되기 전에 정적 생성자가 실행되었음을 의미합니다.
반면, "This is Instance Constructor" 메시지는 객체를 생성할 때마다 출력됩니다. 즉, d1과 d2 두 개의 객체를 생성했기 때문에 인스턴스 생성자가 두 번 호출된 것입니다.
또한 정적 필드 val1은 모든 객체가 값을 공유하기 때문에 항상 70으로 출력되지만, 인스턴스 필드 val2는 각 객체마다 별도로 존재하므로 110과 200이라는 서로 다른 값이 출력됩니다.
핵심 요약
- 정적 생성자: 클래스당 한 번만 실행되며, 정적 멤버 초기화에 사용됩니다.
- 인스턴스 생성자: 객체가 생성될 때마다 호출되며, 인스턴스 멤버를 초기화합니다.
- 정적 필드는 모든 객체가 공유하고, 인스턴스 필드는 객체별로 독립적으로 유지됩니다.