생성자 사용(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 정적 생성자(구조체)