๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒ ์œ ๋‹ˆํ‹ฐ (Unity)

Day 16 - C# (์ฐธ์กฐํ˜•, ๋ฐ•์‹ฑ, ๋žŒ๋‹ค, ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ)

by shin0707 2024. 5. 1.
728x90
๋ฐ˜์‘ํ˜•

  • ์ฃผ์ œ

1. ๊ฐ’ํ˜•, ์ฐธ์กฐํ˜•

2. ๋ฐ•์‹ฑ, ์–ธ๋ฐ•์‹ฑ(๊ฐ’ํ˜•๊ณผ ์ฐธ์กฐํ˜• ์‚ฌ์ด์˜ ๋ณ€ํ™˜)

3. ๋žŒ๋‹ค & ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ


  • ๊ณต๋ถ€๋‚ด์šฉ

1. ๊ฐ’ํ˜•, ์ฐธ์กฐํ˜• (๋ณ€์ˆ˜๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ์„œ๋กœ ๋‹ค๋ฆ„)

1-1. ๊ฐ’ํ˜•

๋ณ€์ˆ˜์— ๊ฐ’์„ ์ง์ ‘ ์ €์žฅ --> (์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ์‚ฌ์šฉ)

๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ , ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ์ „๋‹ฌ ์‹œ ๊ฐ’์ด ๋ณต์‚ฌ๋จ.

ex) int, float, string, double, bool ๋“ฑ

struct MyStruct
{
    public int Value;
}

MyStruct struct1 = new MyStruct(); // ๋™์ ํ• ๋‹น
struct1.Value = 10;

MyStruct struct2 = struct1;       // struct2๋Š” struct1์˜ ๊ฐ’ ๋ณต์‚ฌ

struct2.Value = 20;               //(struck1 ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ)

Console.WriteLine(struct1.Value); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 10

 

1-2. ์ฐธ์กฐํ˜•

๋ณ€์ˆ˜์— ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ(๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ณณ์˜ ์ฃผ์†Œ)๋ฅผ ์ €์žฅ --> (์Šคํƒ, ํž™ ๋‘˜๋‹ค ์‚ฌ์šฉ)

ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ์ „๋‹ฌ ์‹œ ์ฐธ์กฐ(๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์ฃผ์†Œ)๊ฐ€ ๋ณต์‚ฌ๋จ.

ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๊ฐ’์„ ๋ณต์‚ฌํ•˜๋ฉด, ์›๋ž˜ ๋ณ€์ˆ˜๊ฐ’๊ณผ ๋ณต์‚ฌ๋œ ๋ณ€์ˆ˜๊ฐ’์€ ํ•œ ๋ฐฐ๋ฅผ ํƒ„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์›๋ž˜ ๋ณ€์ˆ˜๊ฐ’์ด๋‚˜ ๋ณต์‚ฌ๋œ ๋ณ€์ˆ˜๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๊ฐ™์ด ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค.

 

ex) ํด๋ž˜์Šค, ๋ฐฐ์—ด, ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ

class Apple
{
    public int Value;
}

//static void Main(string[] args)
Apple apple1 = new Apple();
apple1.Value = 10;

Apple apple2 = apple1; // apple2๋Š” apple1์˜ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌ

apple2.Value = 20;  // apple1๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” apple2์˜ ๋ณ€์ˆ˜๊ฐ’์ด ๋ณ€ํ•˜๋ฉด apple1๋„ ๋ณ€ํ•จ

Console.WriteLine(apple1.Value); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 20

 

 

***ํด๋ž˜์Šค์˜ ์›๋ž˜ ๋ณ€์ˆ˜๊ฐ’๊ณผ ๋ณต์‚ฌ๋œ ๋ณ€์ˆ˜๊ฐ’์ด ํ•œ ๋ฐฐ๋ฅผ ํƒ€์ง€ ์•Š๊ณ , ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฐฐ๋ฅผ ํƒ€๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

-->๊นŠ์€ ๋ณต์‚ฌ๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋ณ€์ˆ˜๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

 

***๊นŠ์€ ๋ณต์‚ฌ๋ž€?

2024.05.03 - [์œ ๋‹ˆํ‹ฐ] - Day 18 - C# (์–‡์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ, ICloneable)


2. ๋ฐ•์‹ฑ, ์–ธ๋ฐ•์‹ฑ(๊ฐ’ํ˜•๊ณผ ์ฐธ์กฐํ˜• ์‚ฌ์ด์˜ ๋ณ€ํ™˜)

-๋ฐ•์‹ฑ: ๊ฐ’ํ˜• --> ์ฐธ์กฐํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ • (object๋ฅผ ์‚ฌ์šฉ)

-์–ธ๋ฐ•์‹ฑ: ์ฐธ์กฐํ˜• --> ๊ฐ’ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ • (๊ฐ’ํ˜•์˜ ๋ณธ๋ž˜ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉ)

//๊ฐ’ํ˜•์„ ์ฐธ์กฐํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
List<object> myList = new List<object>();

int intValue = 10;
myList.Add(intValue); // int๋ฅผ object๋กœ ๋ฐ•์‹ฑ(์ฐธ์กฐํ˜•์œผ๋กœ ๋ณ€ํ™˜)ํ•˜์—ฌ ์ถ”๊ฐ€

float floatValue = 3.14f;
myList.Add(floatValue); // float๋ฅผ object๋กœ ๋ฐ•์‹ฑํ•˜์—ฌ ์ถ”๊ฐ€

int value1 = (int)myList[0]; // object๋ฅผ int๋กœ ์–ธ๋ฐ•์‹ฑ(๊ฐ’ํ˜•์œผ๋กœ ๋ณ€ํ™˜)
float value2 = (float)myList[1]; // object๋ฅผ float๋กœ ์–ธ๋ฐ•์‹ฑ

 


3. ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ & ๋žŒ๋‹ค

3-1. ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ

๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐ(๋ฉ”์„œ๋“œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ €์žฅ)ํ•˜์—ฌ,

๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3-2. ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ตฌํ˜„(๋ฉ”์„œ๋“œ ๋“ฑ๋ก -> ์‚ฌ์šฉ)

๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๊ฐ€ ์ฐธ์กฐํ•  ๋ฉ”์„œ๋“œ์˜ ํ˜•์‹์€ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

public delegate int ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ช…(int x, int y)

public int ๋ฉ”์„œ๋“œ๋ช…(int x, int y)

delegate int Calculate(int x, int y);        

static int Add(int x, int y)
{
    return x + y;
}

class Program
{
    static void Main()
    {
        // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋ณ€์ˆ˜(calc)์— ๋ฉ”์„œ๋“œ ๋“ฑ๋ก
        Calculate calc = Add;

        // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ์‚ฌ์šฉ
        int result = calc(3, 5);
        Console.WriteLine("๊ฒฐ๊ณผ: " + result);
    }
}

 

3-3. event ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ

event๋Š” ํ• ๋‹น์—ฐ์‚ฐ์ž( = )๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ๋Š” ํ˜ธ์ถœ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

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

// ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ์„ ์–ธ
public delegate void EnemyAttackHandler(float damage);

// ์  ํด๋ž˜์Šค
public class Enemy
{
    // ๊ณต๊ฒฉ ์ด๋ฒคํŠธ
    public event EnemyAttackHandler OnAttack;

    // ์ ์˜ ๊ณต๊ฒฉ ๋ฉ”์„œ๋“œ
    public void Attack(float damage)
    {
        // ์ด๋ฒคํŠธ ํ˜ธ์ถœ
        OnAttack?.Invoke(damage);
				// null ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž
				// null ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
    }
}

// ํ”Œ๋ ˆ์ด์–ด ํด๋ž˜์Šค
public class Player
{
    // ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ฐ›์€ ๋ฐ๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
    public void HandleDamage(float damage)
    {
        // ํ”Œ๋ ˆ์ด์–ด์˜ ์ฒด๋ ฅ ๊ฐ์†Œ ๋“ฑ์˜ ์ฒ˜๋ฆฌ ๋กœ์ง
        Console.WriteLine("ํ”Œ๋ ˆ์ด์–ด๊ฐ€ {0}์˜ ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…์—ˆ์Šต๋‹ˆ๋‹ค.", damage);
    }
}

// ๊ฒŒ์ž„ ์‹คํ–‰
static void Main()
{
    // ์  ๊ฐ์ฒด ์ƒ์„ฑ
    Enemy enemy = new Enemy();

    // ํ”Œ๋ ˆ์ด์–ด ๊ฐ์ฒด ์ƒ์„ฑ
    Player player = new Player();

    // ํ”Œ๋ ˆ์ด์–ด์˜ ๋ฐ๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ ์˜ ๊ณต๊ฒฉ ์ด๋ฒคํŠธ์— ์ถ”๊ฐ€
    enemy.OnAttack += player.HandleDamage;

    // ์ ์˜ ๊ณต๊ฒฉ
    enemy.Attack(10.0f);
}

 

 

3-4. ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ํ• ๋‹น

๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„ ์—†์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ํ™€๋กœ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋ณด๋‹ค ์ฝ”๋“œ๋„ ๊ฐ„๊ฒฐํ•ด์กŒ๋‹ค.

using System;

// ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ์„ ์–ธ
delegate void MyDelegate(string message);

class Program
{
    static void Main()
    {
        // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐ ๋žŒ๋‹ค์‹ ํ• ๋‹น
        MyDelegate myDelegate = (message) =>
        {
            Console.WriteLine("๋žŒ๋‹ค์‹์„ ํ†ตํ•ด ์ „๋‹ฌ๋œ ๋ฉ”์‹œ์ง€: " + message);
        };

        // ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํ˜ธ์ถœ
        myDelegate("์•ˆ๋…•ํ•˜์„ธ์š”!");

        Console.ReadKey();
    }
}
728x90
๋ฐ˜์‘ํ˜•

loading