외부에서는 변수 취급, 내부에서는 고유 기능이 존재하는 개념
점수를 관리하는 point Manager 클래스를 만들면서 개념을 다시 확인해보자.
점수를 관리하면서, 과도한 점수가 추가되는 것을 방지하고자 한다.
코드 생성
//class PointManager
public class PointManager : MonoBehaviour
{
public int point = 0;
}
//class Test
public class Test : MonoBehaviour
{
public PointManager pointManager;
// Start is called before the first frame update
void Start()
{
pointManager.point -= 100;
}
}
두가지 스크립트를 만들어야 한다.
만약 이 코드가 그대로 실행된다고 하면 어떻게 될까?
: 현재 점수는 0점인데도 -100이라는 값이 그대로 적용될 것이다.
우리는 0점 밑으로는 점수가 내려가지 않고, 점수가 추가된다고 하더라도 한번에 과도한 점수가 추가되는 것을 막고자 한다.
코드 수정
public class PointManager : MonoBehaviour
{
public int point = 0;
public void SetPoint(int newPoint)
{
if (newPoint < 0) newpoint = 0;
else if (newPoint > 10000) newpoint = 10000;
point = newPoint;
}
public int GetPoint() { return point; }
}
public class Test : MonoBehaviour
{
public PointManager pointManager;
// Start is called before the first frame update
void Start()
{
pointManager.SetPoint(100); //<- 이 SetPoint 인자의 값을 변경해볼 수 있다
int myPoint = pointManager.GetPoint();
Debug.Log(myPoint);
}
}
실행 결과
우리가 의도한 대로 정상적으로 출력된다.
: 점수 필터링 과정도 동작한다.
이렇게 점수의 마이너스화 및 과도한 증폭을 막았지만, 과정이 번거롭다.
이때 우리는 Property 를 쓸 수 있다.
코드 변경
public class PointManager : MonoBehaviour
{
private int m_point;
public int point
{
get
{
return m_point;
}
set
{
if (value < 0) m_point = 0;
else if (value > 10000) m_point = 10000;
else m_point = value;
}
}
}
public class Test : MonoBehaviour
{
public PointManager pointManager;
// Start is called before the first frame update
void Start()
{
pointManager.point = 100;
Debug.Log("점수 : " + pointManager.point);
}
}
실행 결과
모두 정상적으로 작동한다
코드 설명
1. public int point { ~ }
프로퍼티를 이용한 point 변수이다
외부에서는 변수로서 사용하지만 내부 코드에는 함수처럼 별도의 기능이 존재하여 해당 기능에 맞춰서 작동한다.
ex) pointManager.point = 100; <= SET 동작 ( 값을 적용/변경 )
int a = pointManager.point; <= GET 동작 ( 값을 받아온다 )
2. value
프로퍼티 내부의 자체적인 변수로, 외부에서 할당하는 값을 뜻한다.
위 코드에서는 Test 스크립트의 'pointManasger.point = 100;' 에서의 100이 이 value 로 할당되는 것이다.
프로퍼티를 왜 써야할까?
라는 생각이 들 수 있다.
사실 처음 시행한 코드(함수를 만들어 사용하는 방법)으로도 원하는 동작과 set/get 의 기능 모두 다룰 수 있는데
왜 프로퍼티의 과정을 거칠 필요가 있는 것일까?
필터링 기능이 들어가는 SetPoint() 함수와, 값을 반환하는 GetPoint() 함수를
point 변수 하나로 모두 처리할 수 있다.
그에 따라
PointManager 클래스의 외부에서 point 변수의 값을 사용할 때, SetPoint() 와 GetPoint() 함수 모두 써야 할 필요 없이
변수 하나로 모두 동작 가능해진다.
만약 point 프로퍼티 과정에서 Set 함수를 사용하지 않았다면 어떻게 될까?
Set 함수를 사용하지 않을 경우, 외부에서 point 변수에 값을 덮어씌울 수 없게 된다.
따라서 의도치 않은 버그를 방지할 수 있는 것이다.
예시 코드
public int Count
{
get
{
Monster monsters = FindObjectsOfType<Monster>();
return monsters.Length;
}
set { ~ }
}
레벨에 배치된 객체들 중 'Monster' 스크립트가 추가된 객체들을 찾고, 그 객체들을 monsters 에 할당하는 과정이다.
: 다형성 이용
여기서 monsters 는 배열로서 존재하여 배열의 길이 등의 정보를 일괄적으로 처리할 수 있다.
이 예시코드를 보면 외부에서는 Count 변수를 활용하여 Monster의 수를 찾거나 처리할 수 있게 되는 것이다.
1. 변수로 선언한다
: 외부에서는 변수 취급하지만, 내부에서는 함수처럼 별도의 기능을 가진다.
Get 과 Set 을 통해 변수의 값 받아오기, 값 덮어쓰기 의 동작이 가능해진다.
2. 내부에서 객체들을 일괄처리 할 수 있다.
#16. 추상 클래스(Abstract Class) (0) | 2024.08.05 |
---|---|
#15. 인터페이스(Interface) (0) | 2024.08.05 |
#14. 오버라이드(Override) (0) | 2024.08.03 |
#13. 다형성 (0) | 2024.08.03 |
#12. 상속 심화 (0) | 2024.08.02 |