C#의 생성자 연결

Fil Zjazel Romaeus Villegas 2023년10월12일
  1. 생성자란?
  2. 생성자 오버로딩이란?
  3. 생성자 연결이란 무엇입니까?
  4. 생성자 연결 예제
C#의 생성자 연결

이 자습서에서는 C#에서 생성자 연결을 수행하는 방법을 보여줍니다. 생성자 연결을 이해하려면 먼저 다음 개념을 알아야 합니다.

생성자란?

생성자는 객체가 생성될 때 자동으로 실행되는 클래스의 메서드입니다. 생성자는 공백으로 두거나 새 인스턴스가 생성될 때 따라야 할 다양한 지침과 단계를 포함할 수도 있습니다.

아래에서 이 예제 클래스를 고려하십시오. 이 클래스의 생성자는 초기화 시 아래에 자세히 설명된 대로 해당 변수의 값을 자동으로 설정합니다. 생성자를 비워두면 기본적으로 모든 클래스 변수가 대신 null이 됩니다.

class Tutorial_Class {
  public string name;
  public DateTime created_date;
  public List<string> topics;
  public string description;
  public bool draft;

  public Tutorial_Class() {
    // This is the constructor method
    this.name = "Tutorial Draft";
    this.created_date = DateTime.Now;
    this.topics = new List<string>();
    this.description = "Tutorial Description";
    this.draft = false;
  }
}

생성자 오버로딩이란?

생성자 오버로딩을 사용하면 클래스의 새 인스턴스를 생성할 때 제공한 입력 매개변수를 기반으로 다른 생성자를 호출할 수 있습니다. 허용되는 각 매개변수 시나리오에 대해 사용할 생성자를 정의해야 합니다. 원하는 만큼 생성자 오버로드를 가질 수 있습니다.

아래 예제에서 단일 문자열 입력을 허용하는 또 다른 생성자 함수를 추가했습니다. 입력이 제공되면 이름 변수를 입력 값의 변수로 설정합니다.

class Tutorial_Class {
  public string name;
  public DateTime created_date;
  public List<string> topics;
  public string description;
  public bool draft;

  public Tutorial_Class() {
    // This is the initial constructor method and will be used if no parameter is passed
    this.name = "Tutorial Draft";
    this.created_date = DateTime.Now;
    this.topics = new List<string>();
    this.description = "Tutorial Description";
    this.draft = false;
  }

  public Tutorial_Class(string name) {
    // This is the second constructor method and will be used if you pass a single string parameter
    // Instead of the name variable being set to "Tutorial Draft", it will be set to the value of
    // the input parameter
    this.name = name;
    this.created_date = DateTime.Now;
    this.topics = new List<string>();
    this.description = "Tutorial Description";
    this.draft = false;
  }
}

생성자 연결이란 무엇입니까?

생성자 연결을 사용하면 다른 생성자 내에서 다른 생성자를 호출할 수 있습니다. 동일한 예를 사용하여 매개변수를 전달하지 않고 Tutorial_Class의 새 인스턴스를 생성한다고 가정해 보겠습니다. 두 번째 생성자가 호출되도록 트리거하는 기본 매개변수를 갖도록 초기 생성자를 수정할 수 있습니다. 그래서 컨스트럭터 체인이라는 이름이 붙었다. 또한 사용자가 명시적으로 전달했는지 여부에 관계없이 기본값을 설정하는 선택적 인수와 유사하다고 생각할 수 있습니다.

아래 예제에서는 초기 생성자에서 값을 설정하는 대신 기본 이름 Tutorial Draft를 두 번째 생성자를 트리거하는 생성자에 전달합니다.

class Tutorial_Class {
  public string name;
  public DateTime created_date;
  public List<string> topics;
  public string description;
  public bool draft;

  public Tutorial_Class() : this("Tutorial Draft") {
    // The intiial constructor is now blank but will trigger the second constructor due to the
    // "this("Tutorial Draft")" line.
    // If you remove the parameter, all of the class variables will again be null by default instead
  }

  public Tutorial_Class(string name) {
    // As the initial constructor passed a single string parameter, this constructor is then called
    // and all variable values are set
    this.name = name;
    this.created_date = DateTime.Now;
    this.topics = new List<string>();
    this.description = "Tutorial Description";
    this.draft = false;
  }
}

생성자 연결 예제

위에서 논의한 개념을 사용하여 생성자 연결을 적용하고 다양한 입력에 따라 클래스가 어떻게 동작하는지 확인할 수 있습니다.

예시:

using System;
using System.Collections.Generic;

namespace ConstructorChaining_Example {
  class Program {
    static void Main(string[] args) {
      // Initialize a new instance of the class with no parameters
      Tutorial_Class no_params = new Tutorial_Class();
      // Print the results to the console
      Console.WriteLine("Tutorial_Class with No Parameters:\n");
      PrintVariables(no_params);

      // Initialize a new instance of the class with the tutorial name "Sample Tutorial 1"
      Tutorial_Class string_param = new Tutorial_Class("Sample Tutorial 1");
      // Print the results to the console
      Console.WriteLine("Tutorial_Class with a Tutorial Name Provided:\n");
      PrintVariables(string_param);

      // Initialize a new instance of the class with the tutorial name "Sample Tutorial 2" and a
      // created date of December 31, 2021.
      Tutorial_Class string_and_date_param =
          new Tutorial_Class("Sample Tutorial 2", new DateTime(2021, 12, 31));
      // Print the results to the console
      Console.WriteLine("Tutorial_Class with a Tutorial Name and Created Date Provided:\n");
      PrintVariables(string_and_date_param);

      Console.ReadLine();
    }

    public class Tutorial_Class {
      public string name;
      public DateTime created_date;
      public List<string> topics;
      public string description;
      public bool draft;

      public Tutorial_Class() : this("Tutorial Draft") {
        // This is the initial constructor class which is only executed when no parameters are
        // passed Once the class is created, the second constructor class will be triggered with the
        // name parameter "Tutorial Draft"
        this.description = "No Parameter Passed";
      }

      public Tutorial_Class(string name) : this(name, DateTime.Now) {
        // This is the second constructor class
        // This can be called by two ways, either by initializing the class with no parameters or by
        // passing a specific string parameter for the tutorial name Regardless of how this
        // constructor is triggered, it will by default also execute the third constructor class by
        // passing the current DateTime as the date param
        this.description = "A tutorial name has been passed";
      }

      public Tutorial_Class(string name, DateTime date) {
        // This is the third constructor class
        // Regardless of how the class is initialized, this will always be triggered due to how the
        // constructors are chained
        this.name = name;
        this.created_date = date;
        this.topics = new List<string>();
        this.description = "A tutorial name and created date have both been passed";
        this.draft = false;
      }
    }

    public static void PrintVariables(Tutorial_Class tutorial) {
      // This function accepts a Tutorial_Class and prints three of its variables to the console
      Console.WriteLine("Tutorial Name: " + tutorial.name + "\n");
      Console.WriteLine("Created Date: " + tutorial.created_date.ToString() + "\n");
      Console.WriteLine("Description: " + tutorial.description + "\n");

      Console.WriteLine("\n");
    }
  }
}

위의 예에서 Tutorial_Class의 세 가지 인스턴스를 만들고 각각에 다른 매개변수를 제공했습니다. 어떤 생성자가 먼저 초기화되었는지에 관계없이 항상 세 번째 생성자를 트리거했음을 관찰할 수 있습니다. 이는 설명뿐만 아니라 다른 변수도 값을 갖는 방식을 통해 확인할 수 있습니다.

주목해야 할 또 다른 중요한 점은 연결 생성자가 기본 생성자에서 명령을 실행하기 전에 먼저 호출된다는 것입니다. 이는 처음에 어떤 매개변수가 제공되었는지에 따라 달라지는 설명 변수를 통해 확인할 수 있습니다.

출력:

Tutorial_Class with No Parameters:

Tutorial Name: Tutorial Draft

Created Date: 28/12/2021 8:25:35 pm

Description: No Parameter Passed



Tutorial_Class with a Tutorial Name Provided:

Tutorial Name: Sample Tutorial 1

Created Date: 28/12/2021 8:25:35 pm

Description: A tutorial name has been passed



Tutorial_Class with a Tutorial Name and Created Date Provided:

Tutorial Name: Sample Tutorial 2

Created Date: 31/12/2021 12:00:00 am

Description: A tutorial name and created date have both been passed