ref 키워드를 설명할 수 있을 정도로 이해하진 못했지만,
대충 어떻게 사용할 수 있는지는 감이 잡힌다.
static void Main(string[] args)
{
int number1 = 5;
int number2 = 5;
RefTest(number1, ref number2);
Console.WriteLine($"number1의 값은? : {number1}");
Console.WriteLine($"number2의 값은? : {number2}");
}
static void RefTest(int num1, ref int num2)
{
num1 += 5;
num2 += 5;
}
int 변수 number1과 number2가 있다.
RefTest함수에 인수로 담아서 전달하면 콘솔창에 어떤 값이 출력될까?

ref키워드 없이 넘긴 number1의 값은 RefTest함수 안에서는 값이 증가했지만,
Main함수에서는 그대로 5가 되었다.
ref키워드를 달아 넘긴 number2의 값은 5가 증가해 10이 되었다.
무슨 차이일까?
number1은 값에 의한 호출 방식으로 전달되며,
RefTest에 전달할 때 변수의 복사본을 전달하는 방식이다.
즉 Main의 number1변수를 새로운 변수로 복사해서,
RefTest의 새로운 num1변수가 된다고 생각하면 된다.
예로 들면 폴더 A와 폴더 B가 있다고 해보자.
폴더 A에는"강아지"가 적힌 메모장이 있다.
이 메모장을 폴더 B로 복사 붙여넣기한 뒤,
폴더 B의 메모장을 열어"강아지"를"고양이"로 수정한다면,
폴더 A의 메모장에는 무엇이 적혀있을까?
답은 여전히 "강아지"가 적혀있다.
복사하고 붙여넣기하는 순간 폴더 B의 메모장은 원본이 아닌 새로운 객체가 된다.
그래서 폴더 B의 메모장을 아무리 수정하더라도, 폴더 A의 메모장에는 아무런 변화가 없다.
number2는 참조에 의한 호출 방식으로 전달되며,
RefTest에 전달할 때 원본 변수를 전달하는 방식이다.
즉 RefTest 내부에서 num2 += 5;를 실행하면,
원본 데이터를 직접 수정하기 때문에, number2의 값도 같이 변화한 것이다.
MSW에서는 EntityRef나 ComponentRef 같은 개념이 있었으나 사용해보지 않았다.
그냥 값에 의한 호출이나 참조에 의한 호출을 신경쓰지 않고,
변수에 접근해서 수정하는 방식으로 사용했기에 어색했다.

1.
Function1에서 플레이어 엔티티를Function2로 전달
2.Function2내부에서PlayerComponent에 접근
3.player의 현재 체력을 -10 감소
MSW에서 변수에 접근해서 값을 변경하는 방식도,
결국 매개변수 player를 참조하여 Hp값을 수정하는 것과 같다고 느꼈다.
MSW를 사용할 때, "이 값은 바뀌고 왜 이 값은 안바뀌지?" 라고 생각하며 사용했었는데
이제는 왜 값의 변화가 있고 없는지 이해가 된다.