๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90

*์ด ๊ธ€์€ <์œ ๋‹ˆํ‹ฐ C# ์Šคํฌ๋ฆฝํŒ… ๋งˆ์Šคํ„ฐํ•˜๊ธฐ> ์ฑ…์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณต๋ถ€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ ์‹œ, ์‚ญ์ œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

1. ํ”„๋กœํผํ‹ฐ(Property)

 

์™ธ๋ถ€์—์„œ ์–ด๋–ค ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ด๊ณณ ์ €๊ณณ์—์„œ ๊ฐ€์ ธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์—์„œ๋งˆ๋‹ค ์กฐ๊ฑด์„ ๋ณด๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์›ํ•  ๊ฒ๋‹ˆ๋‹ค.

 

  • ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅด๋„๋ก ๊ฐ•์ œํ•˜์—ฌ, ํ• ๋‹น๋œ ๊ฐ’์„ ํ™•์‹คํžˆ ํ•˜๊ธธ ๋ฐ”๋ž„ ๊ฒฝ์šฐ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”Œ๋ ˆ์ด์–ด ์ฒด๋ ฅ์„ 0 ~ 100์—๋งŒ ๊ฐ’ ํ• ๋‹นํ•˜๊ธฐ, ์ •ํ•ด์ง„ ์กฐํ•ฉ๋งŒ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฌธ์ž์—ด ๋ณ€์ˆ˜ ๋งŒ๋“ค๊ธฐ ๋“ฑ
  • ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ, ์ด ๊ฐ’์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๊ธธ ์›ํ•  ๊ฒฝ์šฐ

 

์ด์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํ”„๋กœํผํ‹ฐ(Property)์ž…๋‹ˆ๋‹ค.

 

 


2. ํ”„๋กœํผํ‹ฐ์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ

 

1) ์ •ํ•ด์ง„ ๋ฒ”์œ„ ๋‚ด์˜ ๊ฐ’๋งŒ ํ• ๋‹นํ•˜๊ธฐ

 

๋Œ€๋žต์ ์ธ ์‚ฌ์šฉ ์˜ˆ์‹œ ํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public class Example : MonoBehaviour
{

    public float HP      // '_hp' ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ”„๋กœํผํ‹ฐ
    {
        get
        {
            return _hp;
        }

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

    
    private float _hp;  // ์‹ค์ œ ๋‚ด๋ถ€ ํด๋ž˜์Šค ๋ณ€์ˆ˜

}
  • ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์„ ์–ธ๋˜์ง€๋งŒ, ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์ด๋Š” ๊ฒƒ์ด ํŠน์ง•
  • get : ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜์—ฌ ์ฝ์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ํ˜ธ์ถœ๋จ
  • set : ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ์ƒํ™ฉ์—์„œ ํ˜ธ์ถœ๋จ

 

์œ„์™€ ๊ฐ™์ด ํ”„๋กœํผํ‹ฐ์˜ set ํ•จ์ˆ˜์— ์กฐ๊ฑด๋ถ€๋กœ ๊ฐ’์„ ํ• ๋‹น๋ฐ›๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ ๋ณ„๋„์˜ ์กฐ๊ฑด๋ฌธ์ด ํ•„์š”์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Example example = new Example();
example.HP = 10f;         // ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’ ํ• ๋‹น
// example.HP = 5000f;    ๊ฐ’์ด ํ• ๋‹น๋˜๊ธด ํ•˜๋‚˜, ํ”„๋กœํผํ‹ฐ ๋‚ด๋ถ€์—์„œ ํ•„ํ„ฐ๋ง๋œ๋‹ค.

 

 

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;
        }
    }

}

 

์“ฐ๊ธฐ ์ „์šฉ์ด๋ฏ€๋กœ ์ฝ๊ธฐ ๋ถˆ๊ฐ€๋Šฅ

 

 

์ž๋™ ๊ตฌํ˜„ ํ”„๋กœํผํ‹ฐ

 

  • ์กฐ๊ฑด์ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋‹จ์ˆœํžˆ ๋ณ€์ˆ˜ ๊ฐ’ ํ• ๋‹น๊ณผ ๋ฐ˜ํ™˜๋งŒ ํ•  ๊ฒƒ์ด๋ผ๋ฉด ์ž๋™ ๊ตฌํ˜„ ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉ์ด ํŽธํ•จ.
  • 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 };   // ๋‹จ, ํ•œ๋ฒˆ ๊ฐ’ ํ• ๋‹นํ•˜๋ฉด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

 

 

์ดˆ๊ธฐํ™” ์ „์šฉ ์ž๋™ ๊ตฌํ˜„ ํ”„๋กœํผํ‹ฐ

 

C# 9.0์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ๊ธฐ์กด์—๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ถˆํŽธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๊ทธ ํ•„๋“œ์— ์ ‘๊ทผํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋Š” 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;   ์ปดํŒŒ์ผ ์˜ค๋ฅ˜. ์ดˆ๊ธฐํ™” ํ›„ ์ˆ˜์ • ๋ถˆ๊ฐ€

// ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
"์ดˆ๊นƒ๊ฐ’ ์ „์šฉ ์†์„ฑ ๋˜๋Š” ์ธ๋ฑ์„œ "Monster.HP"์€(๋Š”)
๊ฐœ์ฒด ์ด๋‹ˆ์…œ๋ผ์ด์ € ๋˜๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ž๋‚˜
'init' ์ ‘๊ทผ์ž์˜ 'this' ๋˜๋Š” 'base'์—๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

 

 

 


4. ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ

 

์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํผํ‹ฐ

 

์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ ๊ตฌํ˜„๋ถ€๋Š” ๊ฐ–์ง€ ์•Š๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

interface IMonster
{
    string Name     // ์ž๋™ ๊ตฌํ˜„ ํ”„๋กœํผํ‹ฐ์™€ ๋˜‘๊ฐ™์ด ์ƒ๊ฒผ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ๊ตฌํ˜„ํ•ด์ฃผ์ง€ ์•Š์Œ 
    {
        get;
        set;
    }
}


class Monster : IMonster
{
    private string name;
    public string Name      // ์ž์‹ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
    {
        get {return name;}
        set {name = value;}
    }
}

 

 

์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ถ”์ƒ ํ”„๋กœํผํ‹ฐ

 

์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๊ตฌํ˜„๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ํ”„๋กœํผํ‹ฐ๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ถ”์ƒ ํ”„๋กœํผํ‹ฐ(Abstract Property)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

abstract class AbstractMonster
{
    public int HP { get; set;}   // ์ž๋™ ๊ตฌํ˜„ ํ”„๋กœํผํ‹ฐ
    abstract string Name         // ์ถ”์ƒ ํ”„๋กœํผํ‹ฐ
    {
        get;
        set;
    }
}


class Monster : AbstractMonster
{
    public override string Name   // ์ถ”์ƒ ํ”„๋กœํผํ‹ฐ ์žฌ์ •์˜ ๊ฐ•์ œ
    {
        get;
        set;
    }
}

 

 

 

728x90
๋ฐ˜์‘ํ˜•