생성자(C# 프로그래밍 가이드)
생성자 는 클래스 또는 구조체 인스턴스를 생성할 때 런타임에서 호출되는 메서드입니다. 클래스 또는 구조체에는 다른 인수를 사용하는 여러 생성자가 있을 수 있습니다. 생성자를 사용하면 생성 시 형식의 인스턴스가 유효한지 확인할 수 있습니다. 자세한 내용 및 예제는 인스턴스 생성자 및 생성자 사용참조하세요.
새 인스턴스 초기화의 일부인 몇 가지 작업이 있습니다. 다음 작업은 다음 순서대로 수행됩니다.
- 인스턴스 필드는 0으로 설정됩니다. 이 초기화는 일반적으로 런타임에 의해 수행됩니다.
- 필드 이니셜라이저는실행됩니다. 최상위 파생 타입의 필드 이니셜라이저가 실행됩니다.
- 기본 형식 필드 이니셜라이저가 실행됩니다. 직접 기반에서 시작하여 각 기본 형식을 통해 System.Object까지의 필드 이니셜라이저.
- 기본 인스턴스 생성자는실행합니다. Object.Object부터 직접 기본 클래스까지 각 기본 클래스를 통해 진행하는 모든 인스턴스 생성자입니다.
- 인스턴스 생성자가실행합니다. 형식에 대한 인스턴스 생성자가 실행됩니다.
- 개체 이니셜라이저는실행됩니다. 식에 개체 이니셜라이저가 포함된 경우 인스턴스 생성자가 실행된 후에 실행됩니다. 개체 이니셜라이저는 텍스트 순서로 실행됩니다.
위의 작업은 new
연산자사용하여 인스턴스를 만들 때 발생합니다.
struct
새 인스턴스가 default
값으로 설정된 경우 모든 인스턴스 필드는 0으로 설정됩니다. 배열의 요소는 배열을 만들 때 기본값인 0 또는 null
로 설정됩니다.
정적 생성자은(있는 경우) 해당 형식의 인스턴스에 대해 인스턴스 생성자 작업이 수행되기 전에 실행됩니다. 정적 생성자는 최대 한 번 실행됩니다.
생성자 구문
생성자는 형식과 이름이 같은 메서드입니다. 메서드 서명에는 선택적 액세스 한정자, 메서드 이름 및 매개 변수 목록이 포함될 수 있습니다. 반환 형식을 포함하지 않습니다. 다음 예제에서는 이름이 Person
클래스에 대한 생성자를 보여줍니다.
public class Person
{
private string last;
private string first;
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
// Remaining implementation of Person class.
}
생성자를 단일 문으로 구현할 수 있는 경우, 식 본문 멤버을 사용할 수 있습니다. 다음 예제에서는 생성자에 이름이름이 locationName
필드에 할당합니다.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
형식에 인스턴스를 만드는 데 매개 변수가 필요한 경우 다음 예제와 같이 기본 생성자 사용하여 형식을 인스턴스화하는 데 하나 이상의 매개 변수가 필요함을 나타낼 수 있습니다.
public class LabelledContainer<T>(string label)
{
public string Label { get; } = label;
public required T Contents
{
get;
init;
}
}
정적 생성자
이전 예제에서는 새 개체를 초기화하는 인스턴스 생성자를 보여 줍니다. 클래스 또는 구조체는 형식의 정적 멤버를 초기화하는 정적 생성자를 선언할 수도 있습니다. 정적 생성자는 매개 변수가 없습니다. 정적 생성자가 제공되지 않으면 C# 컴파일러는 C# 형식의 기본값 기사에 나열된 대로 정적 필드를 자동으로 기본값으로 초기화합니다.
다음 예제에서는 정적 생성자를 사용하여 정적 필드를 초기화합니다.
public class Adult : Person
{
private static int minimumAge;
public Adult(string lastName, string firstName) : base(lastName, firstName)
{ }
static Adult() => minimumAge = 18;
// Remaining implementation of Adult class.
}
다음 예제와 같이 식 본문 정의를 사용하여 정적 생성자를 정의할 수도 있습니다.
public class Child : Person
{
private static int maximumAge;
public Child(string lastName, string firstName) : base(lastName, firstName)
{ }
static Child() => maximumAge = 18;
// Remaining implementation of Child class.
}
자세한 내용 및 예제는 정적 생성자참조하세요.
참고
.NET