본문 바로가기
카테고리 없음

[코딩일기] C# 프로퍼티

by mania2321 2024. 6. 26.

'Salary', 'Program' 스크립트 2개 미리 생성

<Salary 스크립트>

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class Salary : MonoBehaviour
{
    // private는 은닉성을 보장한다. 하지만 민감한 변수가 많으면 많을수록 민감한 변수당 x2개의 함수가 필요함(get, set). 이럴 때 필요한 것이 프로퍼티!

    private int salary;

    // private int bonus = 10;

    // 예시1. 
    // public int SalaryP { get { return salary ;/*읽기(꺼내오는 것)*/ } /*private set { salary = value; }*/ }/*쓰기. salary 값에다가 넣어줌. 미리 예약된 value(누군가가 만들어 놓은 변수) 반드시 value라는 이름으로 정의해줘야 됨 */
    
    // 예시2.
    // public int SalaryP { get { return salary + bonus/* 보너스를 추가한 월급이 계산되어 나옴 */; } set { if (value < 0) salary = 10; else salary = value; } }        // set 부분해석 => 만약 월급이 잘못 입력되면(월급이 마이너스가 될 순 없으므로) 10을 입력하도록. 그게 아니라면 기입한 월급을 그대로 반영
    
    // 예시3. 자동완성 프로퍼티
    public int SalaryP { get { return salary; } set { if (value < 0) salary = 10; else salary = value; } }
    public int Bonus { get; set; }      // 보다시피 프로퍼티 자체가 변수역할도 함

    // public int SalaryP는 public 이므로 타 클래스에서도 사용 가능.
    // set 앞에 private가 붙으면 타 클래스에서 사용 못함. 
    // set 부분을 아예 지우는 것도 방법이 될 수 있다. 그렇게 되면 동일한 클래스에서 쓰지 못하는데 그럴 땐 밑에 Start를 보다시피 부분에 변수를 선언하고 값을 대입한다.

    //private void SetSalary(int value)
    //{
    //    salary = value;
    //}

    //public int GetSalary()
    //{
    //    return salary;      // 타 클래스에서 salary를 수정할 수는 없지만 읽어들일 수는 있다.
    //}

    void Start()
    {
        // salary = 10;
        // SalaryP = 10;       // value 변수에 10이 대입. 그러면 private int salary 의 값은 10이 됨

        // print(SalaryP);     // 꺼내올 때

        Bonus = 10;
        print(Bonus);

        // 프로퍼티의 대표적인 예시가 배열의 크기를 나타내는 .length다. 
        // int[] a;
        // a.Length;        // length는 프로퍼티로 만들어져 있다. (스패너 모양은 프로퍼티)

    }

}

<Program 스크립트>

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

public class Program : MonoBehaviour
{
    Salary mySalary = new Salary();

    void Start()            // 자신의 연봉을 검색
    {
        //print(mySalary.GetSalary());

        //mySalary.SetSalary(55);

        // mySalary.SalaryP = 50;      // 값을 넣어줄 수도 있고

        print(mySalary.SalaryP);    // 출력할 수도 있다... 그럼 은닉성의 의미가 없는데? => 은닉성을 위해 Salary의 set 부분에 private를 적어준다.
    }
}

댓글