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