본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 19 getter,setter 와 property

데이터를 제한하여 밖에서 못쓰게 하는거까지는 좋았다.

hp도 함부로 다루지 못하게 private에 집어넣었는데

생각해보니까 hp는 화면에 출력해서 생명력이 얼마나 남았는지 보여주어야한다.


그러면 다시 hp를 public을로 바꾸어야 할까?


그래서 나온것이 getter setter이다.


using System;

namespace ConsoleApp1
{
class Character
{
private int hp;
private int speed;

public int GetHp()
{
return hp;
}
public void SetHp(int _hp)
{
hp = _hp;
}

}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
mario.SetHp(10);
Console.WriteLine(mario.GetHp());

}
}
}

이런식으로 hp에 대한 getter 와 setter을 만드는 것이다.



아니 이렇게 private에 있는 변수에 setter getter을 다 만들꺼면

뭐하러 힘들게 hp를 private에 넣은걸까?

어차피 수정 가능하고 가져올수있으면 걍 public에 넣으면 되는거 아닌가?


 굳이 밖에서 변경이 필요없는 경우는 setter를 그냥 빼버리면 된다. getter야 뭐 확인하는 용도인데 크게 문제될것도 없다.


그렇다고 모든 변수를 다 setter, getter을 만들라는것은 아니고 적재 적소에 잘 사용하면된다. 어찌됬든 무분별한 public 사용보다 나으니까.



이렇게 데이터를 숨기는것을 정보은닉이라고하고


한 클래스에 연관된 데이터를 묶고 정보은닉을 하여 클래스 자체를 캡슐처럼? 만드는것을 캡슐화 라고 한다.



그런데 프로그래밍을 하다보면 변수를 기본적으로 private에 때려박고
getter setter를 그냥 기계적으로 만들어버린다.
의미가 없어지는 경향이 크고 일단 getter setter를 만드는 과정이 너무나도 귀찮은것이다.

그래서 각종ide들은 getter setter를 자동으로 만들어주는 기능을 가진경우도 있는데.
아무튼 귀찮다.

이럴때를 위하여
C#은 킹갓기능을 지원해준다

바로 property이다.

using System;

namespace ConsoleApp1
{
class Character
{
private int hp;

public int Hp
{
get { return hp; }
set { hp = value; }
}

private int speed;



}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
mario.Hp = 10;
Console.WriteLine(mario.Hp);

}
}
}

변수처럼 선언되지만

함수처럼 {}으로 묶이는데

저 안에다가 get,set을 지정해줄수있고

해당 변수가 get되는 상황에서는  (read) 자동으로 get에 있는 부분이 불리고

set되는 (write) 상황에서는 자동으로 set부분이 불린다.


아 역시 그럼 이게 hp를 퍼블릭에 때려박은거랑 무슨차이냐 하면..

public int Hp
{
get { return hp; }
}

요렇게 하면

외부에서 set이 불가능하다.

이런식으로 get,set을 원하느 기능만 넣을 수도있고..


using System;

namespace ConsoleApp1
{
class Character
{
private int hp;

public int Hp
{
get { return hp; }
set {
if (value <= 100)
hp = value;
else
hp = 100;
}
}

private int speed;



}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
mario.Hp = 1012;
Console.WriteLine(mario.Hp));

}
}
}

이런식으로 get, set할때 내부에 특정 알고리즘을 넣어

실수로 100 이상이 들어올때 hp를 100으로 고정하여 에러를 미연에 방지할수있다.

그냥 public으로 때려박으면 이런 기능이 불가능하다.


728x90