Unity Chapter 7-7. C# 프로그래밍 [중급] (2/2) : 프로퍼티

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!


Chapter 7. C# 프로그래밍: 중급 (2/2)


🔔 프로퍼티

함수처럼 동작하지만 실은 변수이다. 바깥에서 보면 변수지만 안에 특수한 처리를 끼워넣을 수 있다.


변수에 특수한 처리를 아무 것도 하지 않은 경우

  • 📜PointManager.cs
    • 점수를 관리하는 매니저 스크립트.
    • 멤버 변수인 point(점수) 점수가 아래와 같은 조건을 만족하도록 어떤 함수 처리를 해주어야 한다.
      1. 점수가 음수이면 안된다.
      2. 점수가 너무 큰 수여도 안된다.

📜PointManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PointManager : MonoBehaviour
{
    public int point = 0;
}

📜Test.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Test : MonoBehaviour
{
    public PointManager pointManager;

    void Start()
    {
        pointManager.point = -100;  
        pointManager.point = 99999;
    }
}

public한 변수일 경우 point 값이 이렇게 올바르지 못한 값(음수, 너무 큰 수)으로 덮어 씌워질 우려가 있다.


private과 함수를 사용한 처리

함수`를 사용하여 변수에 어떤 특수한 조건 처리를 해줄 수 있다.

📜PointManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PointManager : MonoBehaviour
{
    private int point = 0;

    public void SetPoint(int newPoint)
    {
        if(newPoint < 0)
        {
            point = 0;
        }
        else if (newPoint > 10000)
        {
            point = 10000;
        }
        else
        {
            point = newPoint;
        }
    }

    public int GetPoint()
    {
        Debug.Log(point);
        return point;
    }
}
  • pointprivate으로 바꿔준 후 함수로 조건을 처리한다.
  • 함수
    • SetPoint
      • 음수인 점수는 0으로
      • 10000을 넘는 점수는 10000으로
      • 음수도 10000도 아닌 점수는 인수로 들어온 값으로 바꿔준다.
    • GetPoint
      • 점수를 출력 후 리턴
  • 이렇게 함수를 사용하여 point 변수에 어떤 특수한 조건 처리를 해줄 수 있다.

📜Test.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Test : MonoBehaviour
{
    public PointManager pointManager;

    void Start()
    {
        pointManager.SetPoint(99999);  // 함수 호출
        int myPoint = pointManager.GetPoint();  // 함수 호출 
        Debug.Log("현재 점수: " + myPoint);
    }
}
  • 위와 같이 99999를 인수로 넘겨도 함수의 처리를 통하여 10000으로 대입된다.


프로퍼티를 사용하여 처리한 경우

  • 함수는 코드가 길어지고 복잡하다.
  • 그러나 프로퍼티는 간결하다.
    • 바깥에서는 변수처럼 사용하는데
    • 내부에서는 함수처럼 동작하여 겉으로 보기에 간결하다.

📜PointManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PointManager : MonoBehaviour
{
    public int point
    {
        get  // int a = point;  내부적으로 get이 발동 됨
        {
            return m_point;
        }

        set  // point = 100;   내부적으로 set이 발동 됨
        {
            if(value < 0)
            {
                m_point = 0;
            }
            else
            {
                m_point = value;
            }
        }
    }

    public int m_point = 0;
}

프로퍼티는 getset으로 동작한다.

  • pointpublic으로 다시 바꿔주고 프로퍼티를 적용해보자.
  • point프로퍼티를 적용한 변수
    • get
      • Debug.Log(point) 처럼 point를 리턴 받을 때 실행된다.
      • 예를들어 a = point 이렇게 a 라는 변수에 point 값을 대입할 때 point가 리턴되는데
      • 이때, 겉으론 단순 변수끼리의 대입처럼 보이더라도 내부적으로 pointget이 실행된다.
    • set
      • point 값을 초기화 하거나 변경할 때 실행된다.
      • 예를들어 point = 100 이렇게 point 변수에 100의 값을 대입할 때
      • 이때, 겉으론 단순 변수끼리의 대입처럼 보이더라도 내부적으로 pointset이 실행된다.
  • m_point 는 멤버 변수

📜Test.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Test : MonoBehaviour
{
    public PointManager pointManager;

    void Start()
    {
        pointManager.point = -100;
        Debug.Log("현재 점수 " + pointManager.point);
    }
}
  • pointManager.point = -100;
    • point 값을 바꿔 준다.
    • 겉으론 단순 변수끼리의 대입처럼 보이더라도 내부적으로 pointset이 실행된다.
    • set의 처리로, 음수 -100 값을 넣어지만 0으로 대입된다.
  • Debug.Log(“현재 점수 “ + pointManager.point);
    • point 를 리턴한다.
    • 겉으론 단순 변수끼리의 대입처럼 보이더라도 내부적으로 pointget이 실행된다.
    • get의 처리로, point를 출력하고 리턴한다.


get, set 중 하나만 사용할 경우

  • 프로퍼티 변수가 public이더라도
    • get만 사용할 경우
      • 리턴만 받을 수 있고 값을 바꿀 수는 없다.
    • set만 사용할 경우
      • 값만 바꿀 수 있고 리턴 받을 수는 없다.

📜MonsterManager.cs

모든 몬스터 오브젝트의 개수 count 를 알려주는 역할을 하는 매니지먼트.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonsterManager : MonoBehaviour
{
    public int count
    {
        get
        {
            Monster[] monsters = FindObjectOfType<Monster>();

            return monsters.Length;
        }
    }
}
  • get
    • 몬스터 오브젝트들을 리스트로 가져오고
    • 그 리스트의 길이를 리턴하면 바로 몬스터 오브젝트의 개수가 된다.
    • 실시간으로 몬스터의 개수를 알려준다.
  • 프로퍼티 count는 현재 get만 사용하고 있다.

📜Test.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    public MonsterManager monsterManager;

    void Start()
    {
        Debug.Log(monsterManager.count);
        // monsterManager.count = 2; ⚡ 에러!
    }
}
  • Debug.Log(monsterManager.count);
    • count 변수가 리턴되면서 몬스터의 개수를 출력한다.
  • public임에도 불구하고 set은 설정되어 있지 않기 때문에 count 의 값을 바꾸려 하면 에러가 난다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


Unity Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기