프로퍼티

프로퍼티 선언

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;}