상세 컨텐츠

본문 제목

#17. 프로퍼티(Property)

유니티 학습/세미나 자료

by 남민우_ 2024. 8. 5. 17:56

본문

1. 프로퍼티란?

외부에서는 변수 취급, 내부에서는 고유 기능이 존재하는 개념

 

점수를 관리하는 point Manager 클래스를 만들면서 개념을 다시 확인해보자.

 

2. 실습 : 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);
    }
}

 

실행 결과

100점 출력

우리가 의도한 대로 정상적으로 출력된다.

 : 점수 필터링 과정도 동작한다.

 

이렇게 점수의 마이너스화 및 과도한 증폭을 막았지만, 과정이 번거롭다.

이때 우리는 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 로 할당되는 것이다.

 

3. 사용 이유

프로퍼티를 왜 써야할까?

라는 생각이 들 수 있다.

사실 처음 시행한 코드(함수를 만들어 사용하는 방법)으로도 원하는 동작과 set/get 의 기능 모두 다룰 수 있는데

왜 프로퍼티의 과정을 거칠 필요가 있는 것일까?

 

 3-1. 코드의 간결화

왼쪽에 길고 많았던 함수가 변수처리 하나로 줄어든다

필터링 기능이 들어가는 SetPoint() 함수와, 값을 반환하는 GetPoint() 함수를

point 변수 하나로 모두 처리할 수 있다.

 

그에 따라

외부 Test 클래스에서도 코드가 간결해진 모습

PointManager 클래스의 외부에서 point 변수의 값을 사용할 때, SetPoint() 와 GetPoint() 함수 모두 써야 할 필요 없이

변수 하나로 모두 동작 가능해진다.

 

 3-2. 덮어쓰기 방지

만약 point 프로퍼티 과정에서 Set 함수를 사용하지 않았다면 어떻게 될까?

대입 부분(set기능) 에서 에러 발생

Set 함수를 사용하지 않을 경우, 외부에서 point 변수에 값을 덮어씌울 수 없게 된다.

따라서 의도치 않은 버그를 방지할 수 있는 것이다.

 

 3-3. 일괄 처리 가능

예시 코드

public int Count
{
	get
	{
		Monster monsters = FindObjectsOfType<Monster>();
		return monsters.Length;
	}
	set { ~ }
}

 

레벨에 배치된 객체들 중 'Monster' 스크립트가 추가된 객체들을 찾고, 그 객체들을 monsters 에 할당하는 과정이다.

 : 다형성 이용

여기서 monsters 는 배열로서 존재하여 배열의 길이 등의 정보를 일괄적으로 처리할 수 있다.

 

이 예시코드를 보면 외부에서는 Count 변수를 활용하여 Monster의 수를 찾거나 처리할 수 있게 되는 것이다.

 

4. 정리

프로퍼티(Property)

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

관련글 더보기