공부/C#

[C#] class 추가와 public / private 속성(프로퍼티)의 get set 초기화식

굴러다니다니 2023. 3. 22. 17:28
728x90

새로 cs파일을 만들어 class를 선언하고 이를 참조해보자.

프로젝트 이름 우클릭 > 추가 > 새 항목 에서 파일을 새로 생성할 수 있다.

 

Player_info.cs파일을 만들었다.

class Player_info
{
	public string Name;
    public float HP;
    public int level;
    public bool isAlive;
}

위와 같이 class에 선언해두었다. player의 이름과 체력, 경험치와 살아있는지 여부를 판단하는 변수를 선언했다.

public으로 선언해 두었기에 원래의 Program.cs에서 main함수에서 참조가 가능하다.

static void Main(string[] args) {
	player.name = "주인공";
}

player의 이름을 주인공으로 바꾸는데 성공하였다. 

하지만 Player_info.cs에서 string Name이 private이었다면 이를 어떻게 가져올 수 있을까?

get과 set을 사용하면 된다.

 

property (속성)

        멤버 변수를 보호하거나 캡슐화를 하고 싶을 때 프로퍼티를 사용해서 가지고 올 수 있다
        get: 값을 불러올 때 사용하는 메소드
        set: 값을 설정할 때 사용하는 메소드
        get과 set은 메소드

다른 클래스에서 참조 하지 못하게 하고 싶을 때는 private 사용한다.

 

다시 돌아와 Player_info.cs에서 다음의 코드를 작성하자.

public string get_name(){
            return Name;
}
public void set_name(string Name){
            this.Name = Name;
}

get_name이라는 함수를 만들어 멤버 변수 Name을 리턴해 주었고,

set_name이라는 함수를 만들어 받은 매개변수로 name을 바꾸는 함수이다.

여기서 this란 Player_info.cs에서 선언한 Name과 매개변수로 받은 string Name이 헷갈릴 수 있어, 현재 지금 class의 Name을 뜻하는 this.Name으로 사용했다.

 

다시 Program.cs로 돌아가 아래의 코드를 작성하자.

player.set_name("주인공");
Console.WriteLine(player.get_name());

그렇다면 private이라 참조하지 못했던 name을 다시 참조가 가능해졌고, 출력도 가능해졌다.

하지만 위의 get, set은 사실 변수마다 미리 선언해둔 메서드가 존재하기 때문에 간편하게 그를 사용하자.

 

Player_info.cs의 기존 코드를 바꿔보겠다.

public int Level { get; private set; }
public bool isAlive { get; set; }

미리 선언해둔 변수들 뒤에 저렇게 붙이면 get과 set사용이 자유롭게 가능해진다.

사실 get과 set을 선언하지 않아도 사용할 수 있는데, 미리 선언해 불러놓기때문에 메모리적인 효율이 가능해진다.

private을 붙이면 해당 클래스에서만 set을 사용할 수 있다.

 

set에 조건을 추가로 붙일 수도있다.

public float HP를 바꿔보겠다.

public float HP
        {
            get
            {
                return HP;
            }
            set
            {
                if (value  > 100f)
                {
                    HP = 100f;
                }
                else
                {
                HP = value;
                }
            }
        }

HP의 입력이 100보다 크다면 100으로 받게끔 조건을 붙일 수도있다.

 

추가로 Player_info.cs에 초기화 식을 넣어보자

public Player_info(string Name, float HP) 
        {
            this.Name = Name;
            this.HP = HP;
            Level = 1;
            isAlive = true;
        }

위의 선언과 별개로 아래 식을 넣어주면 선언해 둔 변수의 값이 초기값을 주어지게 된다.

 

public void View_playerinfo()
        {
            Console.WriteLine($"{Name}님 환영합니다. 당신의 체력은 {HP}이고 당신의 레벨은 {Level}이고 당신의 현재 상태는 {isAlive}입니다.");
        }

출력용 함수도 만들어주었다.

player.View_playerinfo();
player2.View_playerinfo();

program.cs에서 player 두명을 선언해서 위의 식을 쓴다면 출력이 가능하다.

 

전체 코드

namespace Player
{
    class Player_info
    {
        private string Name;
        private float _hp; //얘는 멤버변수
        public float HP //hp는 public으로 선언 얘는 속성
        {
            get
            {
                return _hp;
            }
            set
            {
                if (value  > 100f)
                {
                    _hp = 100f;
                }
                else
                {
                _hp = value;
                }
            }
        }
        public int Level { get; private set; } //변수 선언시 get set이 기본적으로 있지만, 사용하냐 안하냐에 따라 불리는 시점이 다른데
        //이렇게 써서 미리 선수쳐서 불러놓기 => 메모리적인 효율 //여기서만 set하게끔 private 붙이기 가능
        public bool isAlive { get; set; }
        public Player_info(string Name, float HP) 
        {
            this.Name = Name;
            this.HP = HP;
            Level = 1;
            isAlive = true;
        } //이러면 초기값 설정 가능

        public string get_name()
        {
            return Name;
        }
        public void set_name(string Name)
        {
            this.Name = Name;
            //this -> class안에있는 멤버 변수를 가리킴 private string Name을 가리킴
        }
        
        public void set_hp(float HP)
        {
            this.HP = HP;
        }

        //플레이어의 현재 현황을 보여주는 메소드
        public void View_playerinfo()
        {
            Console.WriteLine($"{Name}님 환영합니다. 당신의 체력은 {HP}이고 당신의 레벨은 {Level}이고 당신의 현재 상태는 {isAlive}입니다.");
        }

    }
}
class Program
    {
        static void Main(string[] args)
        {
            Player.Player_info player = new Player_info("주인공", 1000f); //Player.을 쓰면 이 줄에만 사용
            Player.Player_info player2 = new Player_info("조연", 10f); //Player.을 쓰면 이 줄에만 사용
            //player.name = "주인공"은 player_info.cs에서 name 속성이 public이어야만 가능
            //player.set_name("주인공");
            //Console.WriteLine(player.get_name()); //private으로 걸려있어도 가져오기 가능 근데 귀찮으니까 그냥 있는 get set 쓰자

            //player.HP = 1000f;
            //Console.WriteLine(player.HP);
            //player.Level = 10;
            //player.isAlive = false;

            player.View_playerinfo();
            player2.View_playerinfo();
        }
    }
728x90