클래스를 new로 만들 때 가장 먼저 자동 실행되는 메서드입니다.
즉, 객체를 초기화하는 역할을 합니다.
class Person
{
public Person() // 생성자
{
Console.WriteLine("생성자 호출됨!");
}
}
var p = new Person(); // 생성자 자동 실행
class Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
Person p = new Person("홍길동", 20);
➡ 객체를 만들면서 값을 편하게 넣을 수 있어 실무에서 매우 자주 사용됩니다.
class Account
{
public string Id { get; }
public string Password { get; }
public Account(string id, string password)
{
// 필수 정보 강제
Id = id;
Password = password;
}
}
➡ 생성자를 통해 “이 객체가 동작하려면 반드시 필요한 값”을 강제할 수 있습니다.
Person p = new Person();
“필드처럼 보이지만, 사실은 메서드처럼 동작하는 문법”입니다.
즉, 필드 + Getter + Setter를 간단하게 묶어둔 기능입니다.
public class Person
{
public string Name { get; set; }
}
Person p = new Person();
p.Name = "철수"; // set 실행
Console.WriteLine(p.Name); // get 실행
➡ 내부에서 자동으로 private 필드를 생성하므로 매우 편리합니다.
private int _age;
public int Age
{
get { return _age; }
set
{
if (value < 0)
throw new Exception("나이는 음수가 될 수 없습니다.");
_age = value;
}
}
➡ 유효성 검사가 필요한 경우 이런 방식으로 커스터마이징합니다.
public int Id { get; }
➡ 생성자에서만 값을 설정할 수 있습니다.
public class Order
{
public int OrderId { get; init; }
}
var o = new Order { OrderId = 123 };
➡ 생성 시에만 값을 설정할 수 있고 이후에는 변경할 수 없습니다.
➡ 불변 객체(Immutable Object)에 적합합니다.
| 목적 | 생성자 사용 | Property 사용 |
|---|---|---|
| 객체 생성 시 필요한 필수값 | ✔ 강제 가능 | ❌ 강제 불가 |
| 객체 생성 후 변경할 값 | ❌ 적합하지 않음 | ✔ 적합 |
| 필수값 전달 | ✔ 생성자가 적합 | |
| 선택적 값 | ✔ Property에 적합 |
class User
{
// 필수값 - 생성자로 강제
public string Id { get; }
public string Password { get; }
// 선택값 - 속성으로 설정
public string Email { get; set; }
public string Phone { get; set; }
public User(string id, string password)
{
Id = id;
Password = password;
}
}
var user = new User("hong", "1234")
{
Email = "hong@test.com",
Phone = "010-1234-5678"
};
➡ 필수값과 선택값을 명확하게 구분한 실무 패턴입니다.
class Car
{
public string Model { get; }
public int Year { get; }
public int CurrentSpeed { get; set; }
public Car(string model, int year)
{
Model = model;
Year = year;
}
}
Car c = new Car("K5", 2021);
c.CurrentSpeed = 100;