다른 언어에는 없는 Property라는 것이 존재한다.
기존에 데이터를 은닉시키고 조건을 만족할 때만 get과 set을 하기 위해서는 다음과 같이 사용해야 할 것이다.
class Data
{
private int data;
public void setData(int data)
{
this.data = data;
}
public int getData()
{
return data;
}
}
그런데 이를 좀 더 간편하게 사용하기 위해서 나온 것이 프로퍼티이다.
using System;
namespace Study11
{
class Program
{
class Data
{
private int mDataA;
private int mDataB;
private int mDataC;
private int mDataD;
public int DataA
{
get
{
Console.WriteLine("Data A의 값을 불러왔습니다.");
return mDataA;
}
set
{
mDataA = value;
Console.WriteLine("Data A의 값이 설정되었습니다.");
}
}
public int DataB
{
get
{
Console.WriteLine("Data B의 값을 불러왔습니다.");
return mDataB;
}
set
{
if (value >= 3)
{
Console.WriteLine("Data B의 값이 설정되었습니다.");
mDataB = value;
}
else
{
Console.WriteLine("Data B의 값을 3이상으로 설정해주세요.");
}
}
}
public int DataC
{
get
{
Console.WriteLine("Data C의 값을 불러왔습니다.");
return mDataC;
}
set
{
if (value >= 10)
{
Console.WriteLine("Data C의 값이 설정되었습니다.");
mDataC = value;
}
else
{
Console.WriteLine("Data C의 값을 10이상으로 설정해주세요.");
}
}
}
public int DataD
{
get
{
Console.WriteLine("Data D의 값을 불러왔습니다.");
return mDataD;
}
set
{
if (value >= 100)
{
Console.WriteLine("Data D의 값이 설정되었습니다.");
mDataD = value;
}
else
{
Console.WriteLine("Data D의 값을 100이상으로 설정해주세요.");
}
}
}
}
static void Main(string[] args)
{
Data data = new Data();
data.DataA = 0;
Console.WriteLine($"Data A: {data.DataA}\n");
data.DataB = 0;
Console.WriteLine($"Data B: {data.DataB}\n");
data.DataB = 5;
Console.WriteLine($"Data B: {data.DataB}\n");
data.DataC = 20;
Console.WriteLine($"Data C: {data.DataC}\n");
data.DataD = 99;
Console.WriteLine($"Data D: {data.DataD}\n");
data.DataD = 101;
Console.WriteLine($"Data D: {data.DataD}\n");
}
}
}
다음과 같이 일반적으로 필드명으로 변수를 노출시키면 잘못된 사용으로 설계가 망가질 수 있는 것을 방지하기 위해서 getter와 setter를 사용한다. 그런데 일일히 setter와 getter 함수를 각각 만들어 호출하여 사용하면 귀찮아지기 때문에 setter와 getter처럼 조건을 걸 수 있으면서 하나의 변수로 get과 set이 되게끔 하려는게 property의 목적이다.
구조는 아래와 같다.
value라는 키워드를 써서 =을 통해 들어오는 우항의 값을 얻어올 수 있다.
private 자료형 필드명; 접근제어자 자료형 프로퍼티명 { get { return 필드명; } set { 필드명 = value; } } ]
C# 7.0 버전 이상부터는 return 필드명과, 필드명 = value를 사용하는 것도 귀찮기 때문에 더 간단하게 하기위해 자동으로 프로퍼티를 만들어준다.
사용법은 다음과 같다.
using System;
namespace Study12
{
class Program
{
class Data
{
public int MData { get; private set; } = 10;
}
static void Main(string[] args)
{
Data data = new Data();
Console.WriteLine($"{data.MData}");
}
}
}
일반 변수를 선언하듯이 선언 후에 대괄호와 함께 get과 set 키워드를 사용하면 된다.
추가적으로 get과 set에 접근제어자를 설정할 수 있는데 몇가지 조건이 존재한다.
1. 데이터를 선언할 때 사용한 접근제어자보다 더 영향력이 낮은 접근제어자를 사용해야 한다. (오류코드 : CS0273)
ex>
class Data
{
public int MData {public get; set; } = 10;
// public get으로 인해 에러 발생
}