[C#] ν”„λ‘œνΌν‹°(Property)

2022. 6. 19. 18:12Β·πŸ“ Language/✏ C#

ν”„λ‘œνΌν‹°(Property)

μ™ΈλΆ€μ—μ„œ 클래슀 λ³€μˆ˜μ˜ 값을 ν• λ‹Ήν•  λ•Œ, 일반적으둜 λ‹€μŒκ³Ό 같이 원할 것이닀.

  • λ³€μˆ˜μ˜ 값이 항상 μ˜¬λ°”λ₯΄λ„둝 κ°•μ œν•˜μ—¬, ν• λ‹Ήλœ 값을 ν™•μ‹€νžˆ ν•˜κΈΈ λ°”λž„ 경우
  • λ³€μˆ˜μ˜ 값이 λ³€κ²½λ˜μ—ˆμ„ λ•Œλ₯Ό κ°μ§€ν•˜μ—¬, 이 값에 영ν–₯을 λ°›λŠ” λ‹€λ₯Έ ν•¨μˆ˜λ‚˜ λ™μž‘μ„ μ‹€ν–‰ν•˜κΈΈ λ°”λž„ 경우

 

ν•΄λ‹Ή λ³€μˆ˜λ₯Ό μ΄κ³³μ €κ³³μ—μ„œ κ°€μ Έκ°€ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜μ—μ„œλ§ˆλ‹€ 쑰건듀을 λ³΄λŠ” 것은 낭비일 수 μžˆλ‹€.

ν”„λ‘œνΌν‹°κ°€ 이런 뢀뢄을 단 λ²ˆμ— ν•΄κ²°ν•΄μ€€λ‹€.

 

참고둜 ν”„λ‘œνΌν‹°λŠ” Unity의 μΈμŠ€νŽ™ν„°μ—μ„œλŠ” 보이지 μ•ŠλŠ”λ‹€.
보이게 ν•˜κΈ° μœ„ν•΄μ„  λ‹€λ₯Έ μΆ”κ°€ μ‘°μΉ˜κ°€ ν•„μš”ν•˜λ‹€.

 

1. μ •ν•΄μ§„ λ²”μœ„ λ‚΄μ˜ κ°’λ§Œ ν• λ‹Ήν•˜κΈ°

  • get: μ™ΈλΆ€μ—μ„œ ν•΄λ‹Ή ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜μ—¬ 읽어야 ν•˜λŠ” μƒν™©μ—μ„œ ν˜ΈμΆœλœλ‹€.
  • set: μ™ΈλΆ€μ—μ„œ ν•΄λ‹Ή ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜μ—¬ 값을 ν• λ‹Ήν•΄μ•Ό ν•˜λŠ” μƒν™©μ—μ„œ ν˜ΈμΆœλœλ‹€.
public class Example : MonoBehaviour
{
    public float HP // ν”„λ‘œνΌν‹°
    {
        get
        {
            return _hp;
        }

        set
        {
            if (_hp >= 0f && _hp <= 100f)
            {
                _hp = value;
            }
        }
    }

    private float _hp; // μ‹€μ œ λ‚΄λΆ€ 클래슀 λ³€μˆ˜
}

 

2. νŠΉμ • 이벀트 λ°œμƒμ‹œν‚€κΈ°

λ³€μˆ˜μ˜ 값이 λ³€κ²½λλ‹€λŠ” 것을 μ•Œλ €μ£ΌλŠ” 이벀트λ₯Ό λ°œμƒμ‹œν‚€κΈΈ μ›ν•œλ‹€λ©΄ ν”„λ‘œνΌν‹°λ₯Ό ν†΅ν•΄μ„œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

public float HP
{
    get
    {
        return _hp;
    }

    set
    {
        if (_hp >= 0f && _hp <= 100f)
        {
            float preHp = _hp;
            _hp = value;

            if (!Mathf.Approximately(_hp, preHp))
                OnChangeValue();
        }
    }
}

 

3. 읽기 μ „μš©κ³Ό μ“°κΈ° μ „μš© ν”„λ‘œνΌν‹°

읽기 μ „μš©μ΄λ―€λ‘œ κ°’ 할당이 λΆˆκ°€λŠ₯ν•˜λ‹€.

public class Example : MonoBehaviour
{
    private float _hp;
    public float HP // 읽기 μ „μš©
    {
        get
        {
            return _hp;
        }
    }
}

 

μ“°κΈ° μ „μš©μ΄λ―€λ‘œ 읽기가 λΆˆκ°€λŠ₯ν•˜λ‹€.

public class Example : MonoBehaviour
{
    private float _hp;
    public float HP // μ“°κΈ° μ „μš©
    {
        set
        {
            _hp = value;
        }
    }
}

 

μ™ΈλΆ€μ—μ„œλŠ” 읽기 μ „μš©μ΄κ³  λ‚΄λΆ€μ—μ„œλŠ” 쑰건뢀 κ°’ 할당을 ν•˜κ³  싢을 κ²½μš°μ—λŠ” λ‹€μŒκ³Ό 같이 μ“Έ 수 μžˆλ‹€.

public class Example : MonoBehaviour
{
    private float _hp;
    public float HP
    {
        get
        {
            return _hp;
        }

        private set
        {
            if (_hp >= 0f && _hp <= 100f)
            {
                _hp = value;
            }
        }
    }
}

 

4. μžλ™ κ΅¬ν˜„ ν”„λ‘œνΌν‹°

쑰건이 μžˆλŠ” 것이 μ•„λ‹Œ λ‹¨μˆœνžˆ λ³€μˆ˜ κ°’ ν• λ‹Ή, λ°˜ν™˜λ§Œ ν•  것이라면 μžλ™ κ΅¬ν˜„ ν”„λ‘œνΌν‹°κ°€ νŽΈν•˜λ‹€. 클래슀 λ‚΄λΆ€ λ³€μˆ˜μ— ν• λ‹Ή, λ°˜ν™˜μ΄ μ•„λ‹Œ ν”„λ‘œνΌν‹° κ·Έ 자체λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ get, set μ ‘κ·Όμž μ•ˆμ— 아무것도 μ“°μ§€ μ•ŠμœΌλ©΄ λœλ‹€.

public class Example : MonoBehaviour
{
    public float HP { get; set; }  // μžλ™ κ΅¬ν˜„ ν”„λ‘œνΌν‹°
}

class ExternalClass
{
    public void Function()
    {
        Example example = new Example();
        example.HP = 50f;
    }
}
// 1. ν”„λ‘œνΌν‹°λŠ” μ„ μ–Έκ³Ό λ™μ‹œμ— ν•„λ“œμ— λŒ€ν•œ μ΄ˆκΈ°ν™” κ°€λŠ₯
public float HP { get; set; } = 100f;

// 2. 클래슀 객체λ₯Ό 생성할 λ•Œλ„ μ΄ˆκΈ°ν™” κ°€λŠ₯
Example example = new Example() { HP = 100f };

// 3. 무λͺ… ν˜•μ‹ 지원
var example = new { HP = 100f }; // 단, ν•œλ²ˆ κ°’ ν• λ‹Ήν•˜λ©΄ λ³€κ²½ λΆˆκ°€

 

6. μ΄ˆκΈ°ν™” μ „μš© μžλ™ κ΅¬ν˜„ ν”„λ‘œνΌν‹°

κΈ°μ‘΄μ—λŠ” ν”„λ‘œνΌν‹°λ₯Ό 읽기 μ „μš©μœΌλ‘œ μ„ μ–Έν•˜λŠ” 방법이 쑰금 λΆˆνŽΈν–ˆλ‹€. μƒμ„±μžλ₯Ό 톡해 ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  κ·Έ ν•„λ“œμ— μ ‘κ·Όν•˜λŠ” ν”„λ‘œνΌν‹°λŠ” get μ ‘κ·Όμžλ§Œ 갖도둝 ν•΄μ•Ό ν–ˆλ‹€.

class Monster
{
    private string name;
    private int hp;
    private int damage;

    public Monster(string name, int hp, int damage)
    {
        this.name = name;
        this.hp = hp;
        this.damage = damage;
    }

    public string Name { get { return name; } }
    public int HP { get { return hp; } }
    public int Damage { get { return damage; } }
}

 

이런 λΆˆνŽΈν•¨μ€ μžλ™ κ΅¬ν˜„ ν”„λ‘œνΌν‹°μ— init μ ‘κ·Όμžλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ ν•΄κ²°ν•  수 μžˆλ‹€. set μ ‘κ·Όμžμ²˜λŸΌ μ™ΈλΆ€μ—μ„œ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•  μˆ˜ μžˆμ§€λ§Œ, κ°μ²΄ μ΄ˆκΈ°ν™”λ₯Ό ν•  λ•Œλ§Œ κ°€λŠ₯ν•˜λ‹€λŠ” μ μ΄ set μ ‘κ·Όμžμ™€μ˜ μ°¨μ΄μ μ΄λ‹€.

class Monster
{
    public string Name { get; init; }
    public int HP { get; init; }
    public int Damage { get; init; }
}

 

객체 생성 ν›„ ν•΄λ‹Ή ν”„λ‘œνΌν‹° λ‚΄μš©μ„ μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

Monster monster = new Monster
{
    Name = "Slime",
    HP = 500,
    Damage = 10
};

monster.HP = 1000; // 컴파일 였λ₯˜(μ΄ˆκΈ°ν™” ν›„ μˆ˜μ • λΆˆκ°€)

 

7. μΈν„°νŽ˜μ΄μŠ€μ˜ ν”„λ‘œνΌν‹°

μΈν„°νŽ˜μ΄μŠ€μ΄λ―€λ‘œ κ΅¬ν˜„λΆ€λŠ” κ°–μ§€ μ•Šμ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ” ν΄λž˜μŠ€μ—μ„œλŠ” λ°˜λ“œμ‹œ ν”„λ‘œνΌν‹°λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

interface IMonster
{
    string Name // μžλ™ κ΅¬ν˜„ ν”„λ‘œνΌν‹°μ™€ λ˜‘κ°™μ΄ μƒκ²Όμ§€λ§Œ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ κ΅¬ν˜„ν•΄μ£Όμ§€ μ•ŠμŒ
    {
        get;
        set;
    }
}

class Monster : IMonster
{
    private string name;
    public string Name // μžμ‹ ν΄λž˜μŠ€λŠ” 기반 μΈν„°νŽ˜μ΄μŠ€μ— μ„ μ–Έλœ λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό κ΅¬ν˜„ν•΄μ•Ό 함
    {
        get {return name; }
        set {name = value; }
    }
}

 

8. 좔상 클래슀의 좔상 ν”„λ‘œνΌν‹°(Abstract Property)

좔상 ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ²˜λŸΌ κ΅¬ν˜„λ˜μ§€ μ•Šμ€ ν”„λ‘œνΌν‹°μΈ 좔상 ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

abstract class AbstractMonster
{
    public int HP { get; set; } // μžλ™ κ΅¬ν˜„ ν”„λ‘œνΌν‹°
    abstract string Name // 좔상 ν”„λ‘œνΌν‹°
    {
        get;
        set;
    }
}

class Monster : AbstractMonster
{
    public override string Name // 좔상 ν”„λ‘œνΌν‹° μž¬μ •μ˜ κ°•μ œ
    {
        get;
        set;
    }
}
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Language/✏ C#' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [C# 6.0] μƒˆλ‘œμš΄ κΈ°λŠ₯ (1) - ν‘œν˜„μ‹ 레벨
  • [C#] Partial νƒ€μž…, Partial λ©”μ„œλ“œ
  • [C#] μΈλ±μ„œ(Indexer)
  • [C#] ref와 out ν‚€μ›Œλ“œ
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[C#] ν”„λ‘œνΌν‹°(Property)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”