목표

  • 프로퍼티에 대해 이해한다.

프로퍼티(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;
}

+ Recent posts