다음을 통해 공유


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

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

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

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# 컴파일러에서 공용 매개 변수 없는 생성자가 제공됩니다. 자세한 내용은 static 클래스 및 static 클래스 멤버를 참조하세요.

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

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

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

자세한 내용은 전용 생성자를 참조하세요.

구조체 형식의 생성자는 클래스 생성자와 유사합니다. 구조체 형식이 new(으)로 인스턴스화되면 생성자가 호출됩니다. struct이(가) default 값으로 설정되면 런타임은 구조체의 모든 메모리를 0으로 초기화합니다. C# 10 이전에는 컴파일러에서 자동으로 제공되므로 structs은(는) 명시적 매개 변수가 없는 생성자를 포함할 수 없습니다. 자세한 내용은 구조체 형식 문서의 구조체 초기화 및 기본값 섹션을 참조하세요.

다음 코드는 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 문 또는 base 문을 통해 호출해야 합니다. 클래스 및 구조체는 여러 생성자를 정의할 수도 있으며 매개 변수가 없는 생성자를 정의하는 데 둘 다 필요하지 않습니다. 예시:

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를 참조하세요.

파생 클래스에서 기본 클래스 생성자가 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, internal, protected internal 또는 private protected로 표시될 수 있습니다. 이러한 액세스 한정자는 클래스의 사용자가 클래스를 생성하는 방법을 정의합니다. 자세한 내용은 액세스 한정자를 참조하세요.

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

C# 언어 사양

자세한 내용은 C# 언어 사양인스턴스 생성자정적 생성자를 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.

참고 항목