다음을 통해 공유


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

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

다음 예제에서는 간단한 생성자를 사용하여 Taxi 클래스를 정의합니다. 그런 다음 이 클래스는 연산자를 사용하여 인스턴스화됩니다. Taxi 생성자는 새 개체에 대한 메모리가 할당된 직후 new 연산자에 의해 호출됩니다.

public class Taxi
{
    public bool IsInitialized;

    public Taxi()
    {
        IsInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        Console.WriteLine(t.IsInitialized);
    }
}

매개변수를 사용하지 않는 생성자는 '매개 변수 없는 생성자'라고 한다. 매개 변수가 없는 생성자는 new 연산자를 사용하여 개체가 인스턴스화될 때마다 호출되며 new인수가 제공되지 않습니다. C# 12에서는 기본 생성자를 소개합니다. 기본 생성자는 새 개체를 초기화하기 위해 제공해야 하는 매개 변수를 지정합니다. 자세한 내용은 인스턴스 생성자참조하세요.

** 클래스가 정적이 아닌 경우, 클래스 인스턴스를 생성할 수 있도록 C# 컴파일러는 생성자가 없는 클래스에 공용 기본 생성자를 제공합니다. 자세한 내용은 정적 클래스 및 정적 클래스 멤버을 참조하세요.

다음과 같이 생성자를 비공개로 설정하여 클래스가 인스턴스화되지 않도록 할 수 있습니다.

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

자세한 내용은 프라이빗 생성자을 참조하세요.

구조체 형식의 생성자는 클래스 생성자와 유사합니다. 구조체 형식이 new인스턴스화되면 생성자가 호출됩니다. struct default 값으로 설정되면 런타임은 구조체의 모든 메모리를 0으로 초기화합니다. 필드 이니셜라이저를 struct 형식으로 선언하는 경우 매개 변수가 없는 생성자를 제공해야 합니다. 자세한 내용은 구조체 형식 문서의 구조체 초기화 및 기본값 섹션을 참조하세요.

다음 코드는 Int32의 매개 변수가 없는 생성자를 사용하므로 정수가 확실히 초기화되도록 합니다.

int i = new int();
Console.WriteLine(i);

그러나 다음 코드는 new사용하지 않고 초기화되지 않은 개체를 사용하려고 하기 때문에 컴파일러 오류가 발생합니다.

int i;
Console.WriteLine(i);

또는 structs 기반 개체(모든 기본 제공 숫자 형식 포함)를 초기화하거나 할당한 다음 다음 예제와 같이 사용할 수 있습니다.

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사용하여 기본 생성자를 명시적으로 호출해야 합니다.

생성자는 이 키워드를 사용하여 동일한 개체에서 다른 생성자를 호출할 수 있습니다. base와 마찬가지로, this 은 매개 변수를 함께 사용하거나 하지 않고도 사용할 수 있으며, 생성자의 모든 매개 변수는 this의 매개 변수로 사용할 수 있거나, 식의 일부로 사용할 수 있습니다. 예를 들어 이전 예제의 두 번째 생성자는 this사용하여 다시 작성할 수 있습니다.

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

이전 예제에서 this 키워드를 사용하면 이 생성자가 호출됩니다.

public Employee(int annualSalary)
{
    Salary = annualSalary;
}

생성자는 공용, 프라이빗, 보호된, 내부, 보호된 내부 또는 개인적으로 보호된으로 표시할 수 있습니다. 이러한 액세스 한정자는 클래스 사용자가 클래스를 생성하는 방법을 정의합니다. 자세한 내용은 접근 제한자를 참조하세요.

정적 키워드를 사용하여 생성자를 정적으로 선언할 수 있습니다. 정적 생성자는 정적 필드에 액세스하기 직전에 자동으로 호출되며 정적 클래스 멤버를 초기화하는 데 사용됩니다. 자세한 내용은 정적 생성자을 참조하세요.

C# 언어 사양

자세한 내용은 인스턴스 생성자정적 생성자C# 언어 사양에서 참조하세요. 언어 사양은 C# 구문 및 사용의 최종 소스입니다.

참고