클래스 또는 구조체 인스턴스화되면 런타임은 해당 생성자를 호출합니다. 생성자는 클래스 또는 구조체와 이름이 같으며 일반적으로 새 개체의 데이터 멤버를 초기화합니다.
다음 예제에서는 간단한 생성자를 사용하여 Taxi 클래스를 정의합니다. 그런 다음 이 클래스는 new 연산자를 사용하여 인스턴스화됩니다. 런타임은 새 개체에 대한 메모리가 할당된 직후에 Taxi 생성자를 호출합니다.
public class Taxi
{
private string taxiTag;
public Taxi(string tag) => taxiTag = tag;
public override string ToString() => $"Taxi: {taxiTag}";
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi("Tag1345");
Console.WriteLine(t);
}
}
매개변수를 사용하지 않는 생성자는 '매개 변수 없는 생성자'라고 한다. 런타임은 new 연산자를 사용하여 개체가 인스턴스화되고 new인수가 제공되지 않을 때 매개 변수가 없는 생성자를 호출합니다. C# 12에서는 기본 생성자로 을 도입하였습니다. 기본 생성자는 새 개체를 초기화하기 위해 제공해야 하는 매개 변수를 지정합니다. 자세한 내용은 인스턴스 생성자참조하세요.
** 클래스가 정적이 아닌 경우, 클래스 인스턴스를 생성할 수 있도록 C# 컴파일러는 생성자가 없는 클래스에 공용 기본 생성자를 제공합니다. 자세한 내용은 정적 클래스 및 정적 클래스 멤버을 참조하세요.
다음과 같이 생성자를 비공개로 설정하여 클래스가 인스턴스화되지 않도록 할 수 있습니다.
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
자세한 내용은 프라이빗 생성자을 참조하세요.
구조체 형식의 생성자는 클래스 생성자와 유사합니다. 구조체 형식이 new인스턴스화되면 런타임은 생성자를 호출합니다.
struct
default 값으로 설정되면 런타임은 구조체의 모든 메모리를 0으로 초기화합니다. C# 11부터 struct 형식에서 필드 이니셜라이저는 선언된 모든 생성자에서 실행되고, 컴파일러는 생성자가 할당하지 않는 모든 필드를 초기화하므로 매개 변수가 없는 생성자를 선언할 필요가 없습니다. 자세한 내용은 구조체 형식 문서의 구조체 초기화 및 기본값 섹션을 참조하세요.
다음 코드는 Int32의 매개 변수가 없는 생성자를 사용하므로 정수가 확실히 초기화되도록 합니다.
int i = new int();
Console.WriteLine(i);
그러나 다음 코드는 new사용하지 않고 초기화되지 않은 개체를 사용하려고 하기 때문에 컴파일러 오류가 발생합니다.
int i;
Console.WriteLine(i);
또는 일부 struct 형식(모든 기본 제공 숫자 형식 포함)을 초기화하거나 할당한 다음 다음 예제와 같이 사용할 수 있습니다.
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
클래스와 구조체는 모두new 문 또는 기본 문을 통해 호출되어야 합니다. 클래스 및 구조체는 여러 생성자를 정의할 수도 있으며 매개 변수가 없는 생성자를 정의할 필요도 없습니다. 예를 들어:
public class Employee
{
public int Salary;
public Employee() { }
public Employee(int annualSalary) => Salary = annualSalary;
public Employee(int weeklySalary, int numberOfWeeks) => Salary = weeklySalary * numberOfWeeks;
}
이 클래스는 다음 문 중 하나를 사용하여 만들 수 있습니다.
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
생성자는 base 키워드를 사용하여 기본 클래스의 생성자를 호출할 수 있습니다. 예를 들어:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
이 예제에서는 생성자에 대한 블록이 실행되기 전에 기본 클래스에 대한 생성자가 호출됩니다.
base 키워드는 매개 변수를 사용하거나 사용하지 않고 사용할 수 있습니다. 생성자에 대한 모든 매개 변수를 base매개 변수로 사용하거나 식의 일부로 사용할 수 있습니다. 자세한 내용은 기본를 참조하세요.
파생 클래스에서 base 키워드를 사용하여 기본 클래스의 생성자를 명시적으로 호출하지 않은 경우, 만약 매개 변수가 없는 생성자가 존재한다면 그 생성자는 암시적으로 호출됩니다. 다음 생성자 선언은 사실상 동일합니다.
public Manager(int initialData)
{
//Add further instructions here.
}
public Manager(int initialData)
: base()
{
//Add further instructions here.
}
기본 클래스에서 매개 변수가 없는 생성자를 제공하지 않는 경우 파생 클래스는 base사용하여 기본 생성자를 명시적으로 호출해야 합니다.
생성자는 this 키워드를 사용하여 동일한 개체에서 다른 생성자를 호출할 수 있습니다.
base와 마찬가지로, this 은 매개 변수를 함께 사용하거나 하지 않고도 사용할 수 있으며, 생성자의 모든 매개 변수는 this의 매개 변수로 사용할 수 있거나, 식의 일부로 사용할 수 있습니다. 예를 들어 이전 예제의 두 번째 생성자는 this사용하여 다시 작성할 수 있습니다.
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}
이전 예제에서 this 키워드를 사용하면 다음 생성자가 호출됩니다.
public Employee(int annualSalary) => Salary = annualSalary;
생성자는 public, private, protected, 내부적, 보호된 내부적 또는 private protected표시할 수 있습니다. 이러한 액세스 한정자는 클래스 사용자가 클래스를 생성하는 방법을 정의합니다. 자세한 내용은 접근 제한자를 참조하세요.
static 키워드를 사용하여 생성자를 정적으로 선언할 수 있습니다. 정적 생성자는 정적 필드에 액세스하기 전에 자동으로 호출되며 정적 클래스 멤버를 초기화하는 데 사용됩니다. 자세한 내용은 정적 생성자을 참조하세요.
C# 언어 사양
자세한 내용은 인스턴스 생성자 및 정적 생성자를 C# 언어 사양에서 참조하세요. 언어 사양은 C# 구문 및 사용의 최종 소스입니다.
참고
.NET