[C#] 속성

정영훈·2022년 9월 29일
1

C#프로그래밍

목록 보기
16/29

다음과 같은 코드가 있다.

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

    }
}
profile
경북소프트웨어고등학교 정보교사

2개의 댓글

comment-user-thumbnail
2022년 9월 30일

너무 유익해요

답글 달기