📕생성자(Constructors)
📖생성자란?
생성자란 이름이 해당 형식의 이름과 동일한 메서드로, 클래스 또는 구조체 인스턴스를 생성할 때마다 호출된다. 생성자는 접근 제한자, 생성자의 이름, 매개 변수 목록을 포함하며 반환 형식은 포함하지 않는다. 프로그래머는 생성자를 통해 기본값을 설정하고 인스턴스 생성을 제한할 수 있다.
생성자의 형식은 크게 세 가지로 구분할 수 있다.
- 매개 변수가 없는 생성자
- 매개 변수가 있는 생성자
- 기본 생성자
하나씩 살펴 보자.
📌매개 변수가 없는 생성자
public class Taxi
{
public bool IsInitialized;
public Taxi()
{
IsInitialized = true;
}
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi();
Console.WriteLine(t.IsInitialized);
}
}
Taxi라는 이름으로 클래스와 생성자를 만들었다. 클래스는 IsInitialized라는 bool형 변수를 포함하고 생성자는 해당 변수를 'True'로 초기화한다. 생성자는 클래스의 인스턴스가 생성될 때 호출되므로 TestTaxi 클래스의 'Taxi t = new Taxi()' 구문이 실행 때 생성자가 호출될 것이다. 따라서 'Console.WriteLine(t.IsInitialized)'의 출력 결과는 'true'가 된다.
📌매개 변수가 있는 생성자
using System;
namespace Constructor {
class Car {
string brand;
int price;
// 매개 변수가 있는 생성자
Car(string theBrand, int thePrice) {
brand = theBrand;
price = thePrice;
}
static void Main(string[] args) {
Car car1 = new Car("Bugatti", 50000);
Console.WriteLine("Brand: " + car1.brand);
Console.WriteLine("Price: " + car1.price);
Console.ReadLine();
}
}
}
실행 결과
Brand: Bugatti
Price: 50000
매개 변수가 있는 생성자에 매개 변수를 전달할 때는 해당 생성자의 형식에 맞게 전달해야 한다. 즉, 매개 변수 형식과 개수가 다르다면 생성자는 호출되지 않는다.
📌기본 생성자
만약 클래스에 생성자를 정의하지 않았어도 생성자는 자동으로 생성된다. 이를 기본 생성자라고 한다. 기본 생성자는 아무런 코드가 없는 상태로 생성되며 매개 변수 또한 없다.
using System;
namespace Constructor {
class Program {
int a;
static void Main(string[] args) {
// 기본 생성자 호출
Program p1 = new Program();
Console.WriteLine("Default value of a: " + p1.a);
Console.ReadLine();
}
}
}
실행 결과
Default value of a: 0
위 예에서는 클래스 내에 생성자를 정의하지 않았음에도 객체를 생성할 때 생성자가 호출되는 걸 볼 수 있다. 기본 생성자는 초기화하지 않은 모든 변수를 기본 값으로 초기화하기 때문에 a의 값은 0이 된다.
📖생성자의 활용 : 복사, 전용, 정적, 오버로딩
📌복사 생성자
복사 생성자란 다른 생성자를 복사해서 만드는 생성자로, 새 인스턴스를 기존의 인스턴스로 초기화할 때 사용된다.
using System;
namespace Constructor {
class Car {
string brand;
// 생성자
Car (string theBrand) {
brand = theBrand;
}
// 복사 생성자
Car(Car c1) {
brand = c1.brand;
}
static void Main(string[] args) {
// 생성자 호출
Car car1 = new Car("Bugatti");
Console.WriteLine("Brand of car1: " + car1.brand);
// 복사 생성자 호출
Car car2 = new Car(car1);
Console.WriteLine("Brand of car2: " + car2.brand);
Console.ReadLine();
}
}
}
실행 결과
Brand of car1: Bugatti
Brand of car2: Bugatti
📌전용 생성자
외부에서 클래스의 객체를 생성하는 걸 막고 싶다면 private으로 생성자를 정의하면 된다. 이때 private 생성자를 전용 생성자라고 한다.
using System;
namespace Constructor {
class Car {
// 전용 생성자
private Car () {
Console.WriteLine("Private Constructor");
}
}
class CarDrive {
static void Main(string[] args) {
// 전용 생성자 호출
Car car1 = new Car();
Console.ReadLine();
}
}
}
실행 결과
error CS0122: 'Car.Car()' is inaccessible due to its protection level
🔔이처럼 private으로 생성자를 정의하면 객체를 만들 수 없다. 따라서 만약 해당 클래스에 속한 필드와 메서드에 접근하고 싶다면 필드와 메서드를 static으로 선언해야 한다.
📌정적 생성자
static으로 선언한 생성자를 정적 생성자라고 한다. 정적 생성자는 클래스마다 하나만 존재할 수 있으며, 프로그램이 실행되는 동안 한 번만 호출된다. 따라서 정적 생성자는 정적 데이터를 초기화하거나 한 번만 수행해야 하는 작업을 정의할 때 사용된다. 호출되는 시점은 첫 번째 인스턴스가 생성될 때나 정적 멤버가 참조되기 전이다.
using System;
namespace Constructor {
class Car {
// 정적 생성자
static Car () {
Console.WriteLine("Static Constructor");
}
// 매개 변수가 없는 생성자
Car() {
Console.WriteLine("Default Constructor");
}
static void Main(string[] args) {
// 매개 변수가 없는 생성자 호출
Car car1 = new Car();
// 매개 변수가 없는 생성자 재호출
Car car2 = new Car();
Console.ReadLine();
}
}
}
실행 결과
Static Constructor
Default Constructor
Default Constructor
생성자를 두 번 호출했지만 정적 생성자는 처음 한 번만 호출된 것을 볼 수 있다.
📌생성자 오버로딩
한 클래스에서 생성자를 여러 개 만드는 것도 가능한데, 이를 생성자 오버로딩이라고 한다. 다음 코드를 살펴보자.
using System;
namespace ConstructorOverload {
class Car {
// 매개 변수가 없는 생성자
Car() {
Console.WriteLine("Car constructor");
}
// 매개 변수가 하나인 생성자
Car(string brand) {
Console.WriteLine("Car constructor with one parameter");
Console.WriteLine("Brand: " + brand);
}
static void Main(string[] args) {
// 매개 변수가 없는 생성자 호출
Car car = new Car();
Console.WriteLine();
// 매개 변수가 있는 생성자 호출
Car car2 = new Car("Bugatti");
Console.ReadLine();
}
}
}
실행 결과
Car constructor
Car constructor with one parameter
Brand: Bugatti
위 코드에서 Car 생성자는 이름이 같지만 매개 변수의 개수가 다르기 때문에 구분해서 호출할 수 있다.
🔖인용
https://www.programiz.com/csharp-programming/constructors
C# Constructor (With Examples)
In C#, a constructor is similar to a method that is invoked when an object of the class is created. However, unlike methods, a constructor: has the same name as that of the class does not have any return type Create a C# constructor Here's how we create a
www.programiz.com
https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/constructors
생성자 - C# 프로그래밍 가이드
클래스 또는 구조체가 만들어지면 C#의 생성자가 호출됩니다. 생성자를 사용하여 기본값을 설정하고, 인스턴스화를 제한하고, 유연하고 읽기 쉬운 코드를 씁니다.
docs.microsoft.com
'C#' 카테고리의 다른 글
제네릭(Generics)이란? (0) | 2022.06.24 |
---|---|
구조체(Struct)와 클래스(Class) (0) | 2022.06.17 |
프로퍼티(Property, 속성) (0) | 2022.06.14 |
람다 식(Lambda Expression) (0) | 2022.06.12 |
델리게이트(Delegate, 대리자)와 이벤트(Event) (0) | 2022.06.10 |