프로퍼티
프로퍼티 선언
class ClassName
{
Datatype Filed_Name;
Access_Modifier Datatype PropertyName
{
get
{
return Field_Name;
}
set
{
Field_Name = value;
}
}
}
get{}, set{} : 접근자 Accessor
get : 필드로 부터 값을 읽어오는 역할 set : 필드에 값을 할당하는 역할
자동 구현 프로퍼티
- 데이터의 오염에 대해선 메소드처럼 안전하고, 데이터를 다룰 때는 필드처럼 간결
- C# 3.0 부터 적용
public class NameCard
{
private string name;
private string phoneNumber;
public string Name
{
get {return name;}
set {name = value;}
}
public string PhoneNumber
{
get {return phoneNumber;}
set {phoneNumber = value;}
}
}
// 자동 구현 프로퍼티
public class NameCard
{
private string name;
private string phoneNumber;
public string Name { get; set; }
public string PhoneNumber { get; set; }
}
- C# 7.0 이후 부터는 선언과 동시에 초기화 수행이 가능해짐
public class NameCard
{
public string Name { get; set; } = "UnKnown";
public string PhoneNumber { get; set; } = "0000-0000";
}
프로퍼티와 생성자
- 객체 생성 시 각 필드를 초기화하는 방법
class BirthdayInfo
{
public string Name { get; set; }
public DateTime Birthdya { get; set; }
public int Age
{
get
{
return DateTime(DateTime.Now.Subtract(Birthday).Ticks).Year;
}
}
}
class MainApp
{
static void Main()
{
BirthdatInfo birth = new Birthdyinfo()
{
Name = "서현";
Birthday = new DateTime(1991, 6, 28)
};
Console.WriteLine($"Name : {birth.Name}");
Console.WriteLine($"Birthday : {birth.Birthday.ToShortDateString()}");
Console.WriteLine($"Age : {birth.Age}");
}
}
Name : 서현 Birthday : 1991-06-28 Age : 32
초기화 전용 자동 구현 프로퍼티
- 데이터 오염을 방지할 수 있는 장치
- readonly 필드, 접근 제한자, readonly 구조체, 튜플 등
- 프로퍼티의 경우
init;
접근자를 명시하여 사용초기화 전용 (Init-Only) 자동 구현
public class Transaction
{
public string From {get; init;}
public string To {get; init;}
public int Amount {get; init;}
}
class Transaction
{
public string From { get; init; }
public string To { get; inti; }
public int Amount { get; init; }
public override string ToString()
{
return $"{From,-10} -> {To,-10} : ${Amount}";
}
}
class MainApp
{
static void Main()
{
Transaction tr1 = new Transaction{From="Alice", To="Bob", Amount=100};
Transaction tr2 = new Transaction{From="Bob", To="Charlie", Amount=50};
Transaction tr3 = new Transaction{From="Charlie", To="Alice", Amount=50};
Console.WriteLine(tr1);
Console.WriteLine(tr2);
Console.WriteLine(tr3);
}
}
Alice -> Bob : $100 Bob -> Charlie : $50 Charlie -> Alice : $50
- 초기화 이후 tr1 의
Amount
를 30으로 변경시 해당 컴파일 에러 발생 - init 접근자는 초기화 이후에 발생하는 프로퍼티 수정을 허용하지 않으므로, 컴파일 에러 출력
Transaction tr1 = new Transaction{From = "Alice", To = "Bob", Amount = 100};
// 초기화 이후
tr1.Amount = 30; // Compile Error
error CS8852 : 초깃값 전용 속성 또는 인덱서 ‘Transaction.Amount’은(는) 개체 이니셜라이저 또는
인스턴스 생성자나init
접근자의 ‘this’ 또는 ‘base’에만 할당할 수 있습니다.
프로퍼티 초기화를 강제하는 required 키워드
- required 한정자는 선언시 무조건 초기화가 되어야 함
- 실수로 초기화를 하지 않는 실수를 방지할 수 있음
- 반드시 초기화 진행 되도록 Compile에서 강제함
public required string From {get; init;}
public required string TO {get; init;}