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

클래스 또는 구조체의 인스턴스가 만들어질 때마다 해당 생성자가 호출됩니다. 클래스 또는 구조체에는 서로 다른 인수를 사용하는 여러 생성자가 있을 수 있습니다. 프로그래머는 생성자를 통해 기본값을 설정하고, 인스턴스화를 제한하며, 유연하고 읽기 쉬운 코드를 작성할 수 있습니다. 자세한 내용 및 예제는 인스턴스 생성자생성자 사용을 참조하세요.

새 인스턴스 초기화에는 몇 가지 작업이 포함됩니다. 해당 작업은 다음 순서로 수행됩니다.

  1. 인스턴스 필드는 0으로 설정됩니다. 이는 일반적으로 런타임에 의해 수행됩니다.
  2. 필드 이니셜라이저가 실행됩니다. 가장 많이 파생된 형식의 필드 이니셜라이저가 실행됩니다.
  3. 기본 형식 필드 이니셜라이저가 실행됩니다. 직접 베이스로 시작하여 각 기본 형식을 거쳐 System.Object까지의 필드 이니셜라이저입니다.
  4. 기본 인스턴스 생성자가 실행됩니다. Object.Object로 시작하여 각 기본 클래스를 거쳐 직접 기본 클래스에 이르는 모든 인스턴스 생성자입니다.
  5. 인스턴스 생성자가 실행됩니다. 해당 형식의 인스턴스 생성자가 실행됩니다.
  6. 개체 이니셜라이저가 실행됩니다. 식에 개체 이니셜라이저가 포함된 경우 해당 이니셜라이저는 인스턴스 생성자가 실행된 후에 실행됩니다. 개체 이니셜라이저는 텍스트 순서로 실행됩니다.

이전 작업은 새 인스턴스가 초기화될 때 발생합니다. struct의 새 인스턴스가 default 값으로 설정되면 모든 인스턴스 필드가 0으로 설정됩니다.

정적 생성자가 실행되지 않은 경우 인스턴스 생성자 작업이 발생하기 전에 정적 생성자가 실행됩니다.

생성자 구문

생성자는 이름이 해당 형식의 이름과 동일한 메서드입니다. 메서드 서명에는 선택적 액세스 한정자, 메서드 이름 및 매개 변수 목록만 포함됩니다. 반환 형식은 포함되지 않습니다. 다음 예제에서는 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.
}

생성자를 단일 문으로 구현할 수 있는 경우 식 본문 정의를 사용할 수 있습니다. 다음 예제에서는 생성자에 name이라는 단일 문자열 매개 변수가 있는 Location 클래스를 정의합니다. 식 본문 정의에서 locationName 필드에 인수를 할당합니다.

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

정적 생성자

앞의 예제에서는 새 개체를 만드는 인스턴스 생성자를 모두 보여 주었습니다. 클래스 또는 구조체에 형식의 정적 멤버를 초기화하는 정적 생성자도 있을 수 있습니다. 정적 생성자에는 매개 변수가 없습니다. 정적 필드를 초기화하는 정적 생성자를 제공하지 않으면 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.
}

자세한 내용 및 예제는 정적 생성자를 참조하세요.

섹션 내용

참고 항목