목표
- 프로퍼티에 대해 이해한다.
프로퍼티(Property)
-
보통 캡슐화를 진행할때, private로 접근 제한자를 설정하고 get과 set 메서드를 정의하여 객체 내부값에 접근하는 방법을 통일한다.
-
이렇게 하면 데이터가 10개인 경우, 20개의 get/set를 메서드를 정의해야 한다.
-
이 부분을 단순화 시키기 위하여 프로퍼티(Property) 변수를 사용한다.
-
이때 get을 구현하지 않으면 쓰기 전용, set을 구현하지 않으면 읽기 전용으로 분류된다.
class 클래스명
{
데이터타입 필드명;
접근제한자 데이터타입 프로퍼티명
{
get { return 필드명;}
set { 필드명 = value;}
}
}
예제 코드
- 다음 예제는 _number 변수를 조작하기 위한 2가지 방법을 보여주고 있다.
- 첫째로 GetNumber와 SetNumber 함수를 사용하여 내부 변수르 조작하였다.
- 둘째로 NumberProperty라는 Property를 사용한 접근 방법이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PropertiesScripts : MonoBehaviour
{
private int _number;
public PropertiesScripts()
{
_number = 0;
}
// Get, Set Method
public int GetNumber()
{
return _number;
}
public void SetNumber(int number)
{
_number = number;
}
// Property
public int NumberProperty
{
get
{
return _number;
}
set
{
_number = value;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PropertiesSample : MonoBehaviour
{
private PropertiesScripts propertiesScripts;
// Start is called before the first frame update
void Start()
{
propertiesScripts = new PropertiesScripts();
// method를 통한 접근
propertiesScripts.SetNumber(5);
Debug.Log("number : " + propertiesScripts.GetNumber()); // number : 5
// property를 통한 접근
propertiesScripts.NumberProperty = 4;
Debug.Log("number : " + propertiesScripts.NumberProperty); // number = 4
}
}
자동 구현된 속성 (Auto-Implemented Property or Automatic Property)
- 앞서 설명에는 중복을 피하기 위해 프로퍼티를 사용한다고 했는데, 함수를 사용하는 것과 큰 차이가 없다고 느껴질 수도 있다.
- 이런 경우, C# 3.0 이상에서는 자동 구현된 속성(Automatic Property)을 사용하면 된다.
- C# 6.0 이상에서는 필드와 유사하게 초기화를 진행할 수도 있다.
- 컴파일 결과는 NumberProperty와 동일하나, 구현하는 시점에서는 좀더 간결하게 표현할 수 있다.
public class PropertiesScripts
{
private int Number { get; set; } // C# 3.0 이상
private string Name { get; set; } = "Empty"; // C# 6.0 이상
}
람다식 (Lambda Expression)
- C# 3.0 이상에서는 람다식으로 표현할 수 있다.
// Lambda for getter, setter of property
public int Number
{
get => _number;
set => _number = value;
}
주의점
- 일반적으로 set 접근자에서는 개체의 값을 변경 시키는 연산을 넣기도 한다.
- get 접근자에서 개체의 상태를 변경하는 연산을 절대로 하지 않아야 한다.
- 이는 잘못된 프로그래밍 방식이다.
private int _number;
// Lambda for getter, setter of property
public int Number
{
get => _number++;
set => _number = value * 2;
}
'프로그래밍 > Unity C#' 카테고리의 다른 글
[Unity] Tutorial 06 - Intermediate Scripting (Static) (0) | 2019.11.24 |
---|---|
[Unity] Tutorial 06 - Intermediate Scripting (Ternary Operator) (0) | 2019.11.24 |
[Unity] Tutorial 05 - Beginner Gameplay Scripting (Switch) (0) | 2019.11.04 |
[Unity] Tutorial 05 - Beginner Gameplay Scripting (Enumerations) (0) | 2019.11.04 |
[Unity] Tutorial 05 - Beginner Gameplay Scripting (Invoke) (0) | 2019.11.04 |