다음을 통해 공유


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

업데이트: 2007년 11월

생성자는 지정된 형식의 개체를 만들 때 실행되는 클래스 메서드입니다. 생성자의 이름은 클래스의 이름과 동일하며 생성자는 일반적으로 새 개체의 데이터 멤버를 초기화합니다.

다음 예제에서는 간단한 생성자를 사용하여 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# 프로그래밍 가이드)를 참조하십시오.

클래스가 정적 클래스가 아닌 경우 생성자가 없는 클래스에는 클래스 인스턴스화에 필요한 공용 기본 생성자가 C# 컴파일러에 의해 제공됩니다. 자세한 내용은 정적 클래스 및 정적 클래스 멤버(C# 프로그래밍 가이드)를 참조하십시오.

다음과 같이 생성자를 전용 생성자로 만들면 클래스가 인스턴스화되지 않도록 방지할 수 있습니다.

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

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

자세한 내용은 전용 생성자(C# 프로그래밍 가이드)를 참조하십시오.

구조체 형식에 대한 생성자는 클래스 생성자와 비슷하지만 structs에는 컴파일러를 통해 생성자가 자동으로 제공되므로 명시적 기본 생성자가 포함될 수 없습니다. 이 생성자는 struct의 각 필드를 기본값으로 초기화합니다. 자세한 내용은 기본값 표(C# 참조)를 참조하십시오. 그러나 이 기본 생성자는 new를 사용하여 struct를 인스턴스화한 경우에만 호출됩니다. 예를 들어 다음 코드에서는 Int32의 기본 생성자를 사용하므로 정수가 초기화됩니다.

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

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

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);

따라서 값 형식에 대한 기본 생성자를 호출할 필요가 없습니다.

클래스와 structs 모두 매개 변수를 사용하는 생성자를 정의할 수 있습니다. 매개 변수를 사용하는 생성자는 new 문이나 base 문을 통해 호출해야 합니다. 클래스와 structs는 여러 생성자를 정의할 수도 있으며, 둘 모두 기본 생성자를 정의할 필요가 없습니다. 예를 들면 다음과 같습니다.

public class Employee
{
    public int salary;

    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(C# 참조)를 참조하십시오.

파생 클래스에서 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 또는 protectedinternal로 표시할 수 있습니다. 이러한 액세스 한정자는 클래스 사용자가 클래스를 생성하는 방식을 정의합니다. 자세한 내용은 액세스 한정자를 참조하십시오.

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

C# 언어 사양

자세한 내용은 C# 언어 사양에서 다음 단원을 참조하십시오.

  • 1.6.7.1 생성자

  • 10.11 인스턴스 생성자(클래스)

  • 11.3.8 생성자(구조체)

  • 11.3.10 정적 생성자(구조체)

참고 항목

개념

C# 프로그래밍 가이드

참조

클래스 및 구조체(C# 프로그래밍 가이드)

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

소멸자(C# 프로그래밍 가이드)