C++에서는 없지만 C#에서만 있는 문법이 있다.
바로 Property라는 것인데
예를 들어 설명하자면,우리가 어떤 클래스를 만든다고 가정해보자.
class Monster
{
pubic int hp;
}
class Program
{
static void Main(string[] args)
{
Monster monster = new Monster();
monster.hp=100;
monster.hp=10;
}
}
이런식으로 public 변수로 선언하고 코드가 복잡해지면 다른사람들과 코드를 받아서 수정해야하는 상황에서 잘못하여 변수를 건드리게 되면 어디서 바꾼지 고생할 것이다.
그래서 우리는 객체지향적으로 은닉성을 이용하여 protected나 private으로 만들어주면서 GetHp,SetHp 함수를 만들어서 관리를 했었는데 이렇게 관리하면 브레이크포인트를 잡았을 때 어디서 값을 바꿨는지 알 수 있다.
또한 이러한 장점뿐만 아니라 변수를 숨기고 특정 함수로만 접근을 하게 바꾸면
SetHp를 사용할때 바로 접근을 허용하는게 아니라 특정 조건을 추가 할수도있다.
예를 들어, 1번 상태일때만 hp에 접근할수있도록 등등
class Monster
{
protected int hp;
public int GetHp(){ return hp; }
public void SetHp(int hp){ this.hp = hp;}
}
class Program
{
static void Main(string[] args)
{
Monster monster = new Monster();
monster.SetHp(100);
}
}
위에 방식을 property로 구현하면 아래와 같다.
class Monster
{
protected int hp;
pulic int Hp //property
{
get {return hp;}
set {hp = value;} //value는 받는 인자
//물론 private set{ hp = value;}도 가능
}
}
class Program
{
static void Main(string[] args)
{
Monster monster = new Monster();
monster.Hp = 100; //property Hp의 set
int hp = monster.Hp;
}
}
그리고 자동완성 Property도 있는데
class Monster
{
public int Hp { get; set;}
//public int Hp{ get; set;} = 100; 바로 초기화시켜주는 문법도 가능하다. ( C# 7.0이상부터)
}
이면 끝이다. 위에 코드를 풀어 써보자면
class Monster
{
private int _hp;
public int GetHp() {return _hp;}
public void SetHp(int value) { _hp = value; }
}
랑 같은 코드가 유사하다.
정리해보자면,
객체지향의 은닉성을 제공하고싶을 때 안에 있는 변수를 외부에서 마음대로 접근시키지 못하도록 하고 싶을 때 기본적으로 필드자체는 private,protected로 선언 후 public함수로 접근하였는데 C#에서는 은닉성을 가진 property를 만들 수 있다.