Unity_개발일지_13

홍신영·2024년 10월 17일
0

Unity

목록 보기
15/62

프로퍼티

싱글톤은 많이 써 봤지만 인스턴스, 프로퍼티들의 개념을 잘 모르고 썼던 것 같아 정리하게 되었다.

프로퍼티란?
클래스의 데이터(필드)에 읽기 또는 쓰기 작업을 할 수 있도록 하는 맴버이다.

이어 나오는 get;set; 이것이 무엇인가?

get(접근자)

  • get은 프로퍼티의 값을 반환하는 접근자이다.
    *참고로
private int age;
public Age
{
	get { return age;}
}

이거랑

public Age => age;

이거랑 같은거다. 

확실히 프로퍼티에 대한 개념이 없다보니, 잘 모르고 사용한 것이 많은것 같다..

set(접근자)

  • set은 프로퍼티의 값을 설정하는 접근자이다.

return

  • 메서드나 프로퍼티의 실행을 종료하고, 호출한 쪽에 값을 반환하는 데 사용된다.

뭔가 개념은 얼추 알고 있는것 같긴하다. 이어서 예시를 보자.

public class Person
{
    private string _name; // 실제 필드
    private int _age; // 실제 필드

    public string Name // 프로퍼티
    {
        get { return _name; } // _name의 값을 반환
        set { _name = value; } // 전달받은 값을 _name에 할당
    }

    public int Age // 프로퍼티
    {
        get { return _age; } // _age의 값을 반환
        set
        {
            if (value >= 0) // 유효성 검사
            {
                _age = value; // 전달받은 값을 _age에 할당
            }
        }
    }
}

이런 코드처럼 활용해볼 수 있다.

실제 필드에는 private으로 접근을 막아놓고, public 프로퍼티로 get{return _name}으로 반환해 줄 수 있는 우회 방법이다.

이때, 두번째 Age처럼 조건을 걸 수 있다.
set 즉, 들어와 변경하려는 값이 0보다 커야만 값을 수정할 수 있는 식으로 사용할 수 있다.

조금 더 응용해보자.

싱글톤을 구현하는 상황에서 적용방법을 보자

 private static GameManager _instance;

 public static GameManager Instance
 {
     get
     {
         if (_instance == null)
         {
             GameObject go = new GameObject("GameManager");
             go.AddComponent<GameManager>(); //이거는 Monobehavior여서
			//monobehavior아니면 GameManager gm = new GameManager();
         }
         return _instance;
     }
 }
 
  private void Awake()
 {
     if (_instance == null)
     {
         _instance = this;
         DontDestroyOnLoad(gameObject);
     }
     else Destroy(gameObject);
 }

밑에 Awake를 통해 _instance가 널인지 판단하고, 널이면 인스턴스를 생성하고, 이미 있다면 파괴한다.
까지가 보통 내가 사용했던 방식이다.

하지만 게임메니저를 찾지 못하는 경우로 null 일수도 있겠지만, 아에 게임매니저가 없는 경우도 있었다. 예를들면 게임매니저를 동적생성하는데 이것도 Awake, 근데 게임매니저의 인스턴스를 찾는것도 Awake 이런 경우 null이 아닌 아에 오브젝트가 없는경우에를 대비해
빈 오브젝트를 생성 그리고 이름설정해주고, 컴포넌트를 추가하는 방법을 프로퍼티에 조건 안에 넣은 것이다.

그리고 위 코드는 get만 사용하였다. set을 사용 안할수도 있고, 이러면 주기만가능.

이렇게 프로퍼티를 이용해 활용할 것들이 많이 있다는 것을 또 배웠다.
이것 말고도 이벤트를 호출 할 때 사용할 수 있다.
체력이 닳때, set에 조건문을 통해 OnChangeHealth?.Invoke(health); 이런식으로 이벤트 호출도 가능하다.

profile
게임 클라이언트 개발자

0개의 댓글