C# 생성자(Constructor) 총정리: 종류, 예제, 고급 패턴
C# 생성자 (Constructor)
C#에서 생성자가 객체를 초기화하는 방식, 모든 생성자 유형, 패턴, 모범 사례를 다룹니다.
C#에서 생성자는 클래스 새 인스턴스 생성 시 자동 호출되는 특수 메서드. 일반 메서드와 달리:
C# 생성자 만들기
클래스 내부에서 클래스 이름과 동일하게 정의:
class Car {
// 생성자
Car() {
// 초기화 코드
}
}
Car()가 생성자. new 키워드로 호출:
new Car();
예:
Car car1 = new Car();
참고: C# 클래스와 객체.
생성자 종류
대표적 생성자 분류:
- 매개변수 없는 (기본) 생성자
- 매개변수 있는 (Parameterized) 생성자
- 복사 생성자 (Copy Constructor)
- Private 생성자
- 정적 생성자 (Static Constructor)
1. 매개변수 없는 생성자 (Parameterless Constructor)
매개변수 없는 생성자를 매개변수 없는/기본 생성자라 함. 예:
using System;
namespace ConstructorDemo {
class Car {
// 매개변수 없는 생성자
Car() {
Console.WriteLine("Car Constructor");
}
static void Main(string[] args) {
new Car();
Console.ReadLine();
}
}
}
출력
Car Constructor
2. 매개변수 있는 생성자 (Parameterized Constructor)
인수 받아 인스턴스 필드 초기화:
using System;
namespace ConstructorDemo {
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
3. 기본 생성자 (Default Constructor)
생성자 생략 시 컴파일러가 암시적 매개변수 없는 생성자 제공, 필드 기본값 초기화. 예:
using System;
namespace ConstructorDemo {
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
숫자 필드 기본값 0, 문자열/객체 null.
4. 복사 생성자 (Copy Constructor)
다른 객체 상태 복사해 새 인스턴스 생성:
using System;
namespace ConstructorDemo {
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
5. Private 생성자
생성자 private로 외부 인스턴스화 방지, 싱글톤 패턴이나 유틸리티 클래스에 유용.
예제
using System;
namespace ConstructorDemo {
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이어야 클래스 이름으로 접근 가능.
6. 정적 생성자 (Static Constructor)
정적 생성자는 타입당 한 번 실행, 인스턴스/정적 멤버 최초 접근 전. 직접 호출 불가, 매개변수 없음.
using System;
namespace ConstructorDemo {
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
참고: 클래스당 정적 생성자 하나만 가능; 매개변수/접근 한정자 가질 수 없음.
C# 생성자 오버로딩 (Constructor Overloading)
서로 다른 매개변수 리스트로 여러 생성자 정의해 유연한 객체 생성 제공. 예:
using System;
namespace ConstructorOverloadDemo {
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
컴파일러가 인수 개수/타입 기반으로 일치하는 생성자 선택. 더 보기: C# 생성자 오버로딩.