생성자 사용(C# 프로그래밍 가이드)

클래스 또는 구조체 인스턴스화되면 런타임은 해당 생성자를 호출합니다. 생성자는 클래스 또는 구조체와 이름이 같으며 일반적으로 새 개체의 데이터 멤버를 초기화합니다.

다음 예제에서는 간단한 생성자를 사용하여 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# 구문 및 사용의 최종 소스입니다.

참고