본문 바로가기

C# 개인 공부 기록용/어소트락 게임아카데미 - C# 무료강의[2019] 총48강

[C# 강의 12화] !중요! 레퍼런스의 메모리 구조 및 처리 개념

출처 : https://www.youtube.com/watch?v=Cq4olyGLk3g&list=PL4SIC1d_ab-Y-bBKojxhtFWwNpawMM1h5&index=12

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Monster
{
    public int AT = 10;
    public int HP = 100;

    public void ATT(Player _Player)
    {
        // 플레이어의 HP는 얼마일까요?
        // 100 - 10 = 90
        _Player.HP -= AT;
    }
}

class Player
{
    public int AT = 10;
    public int HP = 100;

    // Monster _Monster 클래스가 객체화된 녀석을 받았다.
    public void ATT(Monster _Monster)
    {
        _Monster.HP -= AT;
    }

    public void TEST(int _Test)
    {
        _Test = 1000;
    }
}

namespace Memory_Reference
{
    class Program
    {
        static void Main(string[] args)
        {
            // * 값형과 레퍼런스형을 구분할줄 알아야 한다!
            // * 기본 자료형을 선언만 하면 그녀석들은 값형이다.

            // * 자기가 만든 클래스를 new 클래스명();
            // * 해서 만든 것을 그 클래스명에 받으면
            // * 그건 레퍼런스 형이다.

            // 클래스가 객체화된 녀석은
            // 레퍼런스형이라고 하는 자료형이 되고

            // 여러분들이 여태까지 봐왔던
            // int, bool 이런 녀석들은 값형이라고 한다.

            // 이 값형과 레퍼런스형은
            // 메모리의 위치와 사용법이 다르기 때문에
            // 다르게 동작한다

            // HP = 100
            // AT = 10
            // 이 레퍼런스라고 하는 녀석은
            // 힙에 생성된 어떠한 메모리의 위치를 가리키는 값이다.
            // 클래스를 자료형으로 만든 레퍼런스의 역할은 
            Monster NewMonster = new Monster();

            // HP = 100
            // AT = 10
            Player NewPlayer = new Player();
            // 얕은 이해는
            // .은 안에 값을 끌어내고 싶으면  . 누르면 된다

            // 정확한 이해는
            // 내가 가리키고 있는 위치에 있는 HP를 사용하겠다.

            // 전 강의에서 배웠던 대로라면
            // 플레이어가 자신의 공격력으로
            // 몬스터를 때린것이지만 적용될리가 없을 것이다
            // 라고 잘못 이해할 수 있다.
            // 둘의 HP는 90으로 깎이게 된다.
            NewMonster.ATT(NewPlayer);
            Console.WriteLine(NewPlayer.HP);
            // 플레이어의 HP가 깎인 것인 보인다

            NewPlayer.ATT(NewMonster);
            Console.WriteLine(NewMonster.HP);

            //int value = 100;

            //NewPlayer.TEST(value);

        }
    }
}