다음과 같은 코드가 있다.
class Monster
{
public int hp;
public int attack;
public int defense;
public Monster(int hp, int attack, int defense)
{
this.hp = hp;
this.attack = attack;
this.defense = defense;
}
}
class Program
{
static void Main(string[] args)
{
Monster monster = new Monster(100, 100, 100);
monster.hp = -100;
}
}
몬스터의 에너지를 음수값으로 입력할 수 없다. 프로그래머가 실수로 입력값을 잘못 입력할 수 있기 때문에 원천적으로 막을 필요가 있다.
class Monster
{
private int hp;
private int attack;
private int defense;
public Monster(int hp, int attack, int defense)
{
if (hp > 0 && attack > 0 && defense > 0)
{
this.hp = hp;
this.attack = attack;
this.defense = defense;
}
else
{
Console.WriteLine("0이상의 양수로 입력하세요!");
}
}
}
몬스터 생성자를 정의할 때 값 필드에 직접 접근하지 못하게 private 접근제한자로 접근제한을 걸고, 생성자에서 값을 입력할 때 조건을 확인하여 입력할 수 있도록 조건문을 설정하였다.
그런데 한번 생성한 hp, attack, defense 수정을 할 수 없고, 어떤 값이 들어있는지 확인조차 할 수 없는 일이 발생하였다.
public으로 변수를 선언해버리면 외부에서 마음대로 값을 설정해버릴 수 있다. 이를 방지하기 위해서 private으로 변수를 선언하면 외부에서 아예 값을 건들일 수 없다.
이때 사용할 수 있는 것이 Geter와 Setter이다. 변수를 바로 건드릴 수 없지만 변수를 변경하는 메서드를 만들고, 메서드를 호출하여 변경할 수 있다.
class Monster
{
private int hp;
private int attack;
private int defense;
public Monster(int hp, int attack, int defense)
{
if (hp > 0 && attack > 0 && defense > 0)
{
this.hp = hp;
this.attack = attack;
this.defense = defense;
}
else
{
Console.WriteLine("0이상의 양수로 입력하세요!");
}
}
//겟터
public int GetHp()
{
return hp;
}
//셋터
public void SetHp(int hp)
{
if(hp > 0)
{
this.hp = hp;
}
else
{
Console.WriteLine("0이상의 양수로 입력하세요!");
}
}
}
속성은 겟터와 셋터를 손쉽게 만들 수 있게 하는 방법이다. 다음과 같은 방법으로 속성을 설정할 수 있다.
private int [변수 이름];
public int [속성 이름]
{
get { return [변수 이름];
set { [변수 이름] = value; }
}
class Monster
{
private int hp;
private int attack;
private int defense;
//생성자
public Monster(int hp, int attack, int defense)
{
if (hp > 0 && attack > 0 && defense > 0)
{
this.hp = hp;
this.attack = attack;
this.defense = defense;
}
else
{
Console.WriteLine("0이상의 양수로 입력하세요!");
}
}
//속성
public int Hp
{
get { return hp; }
set
{
if(value > 0)
{
hp = value;
}
else
{
Console.WriteLine("0이상의 양수로 입력하세요!");
}
}
}
}
class Program
{
static void Main(string[] args)
{
Monster monster = new Monster(100, 100, 100);
monster.Hp = 200;
Console.WriteLine(monster.Hp);
}
}
너무 유익해요