Game Development, 게임개발/개발

다른 클래스 변수 접근(public: x / member variable(Property): o) [Unity]

게임이 더 좋아 2021. 3. 20. 06:42
반응형
728x170

 

우리는 접근제한자, Access Modifier를 이용해서 다른 변수에 접근하고는 했다.

하지만 여기서 다른 방법을 제시한다.

바로 member variable로 접근하게 하는것이다.

++ Property라고도 불린다.

 

** 클래스의 구성요소는 Property와 Method라고 해도 무방하다.

 

알아보자

 


 

간단하다.

이 코드를 보자

using UnityEngine;
using System.Collections;

public class Player
{
    //멤버 변수가 필드같이 다뤄지는 것이다.
    
    private int experience;

    
    
    public int Experience
    {
        get
        {
            //Some other code
            return experience;
        }
        set
        {
            //Some other code
            experience = value;
        }
    }

 

private으로 experience를 선언했다. (접근을 막기 위해)

하지만 그 변수를 써야한다면 이것을  public으로 선언하는 것이 좋을까? 

아니다. public이 많아지면 많아질수록 OOP의 장점에서 벗어나는 것이다.

 

**OOP의 장점 중 캡슐화는 응집도는 높여주되, 낮은 결합도를 유지하게 하는데public으로 선언되면 클래스 간의 결합도가 높아진다.즉, experience가 public으로 선언되어 많이 쓰이게 된다면 experience가 변경될 경우 오류가 생길 확률이 높아진다.

 

 

 

그래서 public 선언하는 것 보다는 아래와 같이 public으로 선언 후 Field같이 선언했다.

**이 때 문자는 첫글자를 대문자로 써서 구분해준다.

 

이 필드 안의 get, set 메서드를 통해 private을 얻어낸다.

++ 이 필드는 public이라 접근 가능하며, 이 메서드에서 private을 가져오는 것이 가능해진다.

 

using UnityEngine;
using System.Collections;

public class Game : MonoBehaviour 
{
    void Start () 
    {
        Player myPlayer = new Player();

        //player에 들어있는 해당 Properties 들이 마치 variable처럼 get도 되고 set도 되는 것이다.
        myPlayer.Experience = 5;
        int x = myPlayer.Experience;
    }
}

 

 


 

 

이걸 왜 하느냐??? public이 OOP의 장점을 없앤다고 했는데..?

그럼 이렇게 하면 무엇이 좋아지냐????

 

public으로 설정했을 때는 할 수 없는 것을 하게 된다.

 

1. 쓰기, 읽기 제한을 걸 수 있다.

만약 get만 있다면 읽기만 가능하고

set만 있다면 쓰기만 가능하다는 것이다.

 

2. get, set을 단순히 값을 반환하는 것을 넘어 다른 동작도 가능하다.

이는 get, set의 특성 때문인데 메서드와 같이 쓰이기 때문에

return을 하기 전에 다른 메서드와 같이 코드를 작성할 수 있다.

 

    //Level 은 experience를 이용하는 또 다른 property다.
    
    public int Level
    {
        get
        {
            return experience / 1000;
        }
        set
        {
            experience = value * 1000;
        }
    }

 

또한 단순히 변수만 가져오기 위해서 이렇게 간단하게 선언할 수 있다.

 

public int Health{ get; set;}

 

간단히 알아보았다.

 

 

 

 

 

 

 


참고링크

 

youtu.be/HzIqrlSbjjU

반응형
그리드형