reflection 같은 경우는 일상 코딩에서 자주 사용하는 기능은 아니지만, 개념적으로 굉장히 유용하다. reflection이 무엇이냐면 x-ray를 찍는 것이다라고 보면 된다.
class Monster
{
public int hp;
public int attack;
private float speed;
void Attack() {...};
}
예를들어 몬스터라는 클래스를 만들었다. reflection이라는 기능을 사용하면 우리는 이 클래스가 갖고 있는 모든 정보들을 그냥 런타임에 다 뜯어보고 분석할 수가 있다. 이게 왜 도대체 그렇게 대단하고 유용한 기능인지 아직 와닿지 않을테니 그냥 몇개 사용 예를 보이겠다.
Monster monster = new Monster();
Type type = monster.GetType();
몬스터 객체를 만들어서 .을찍어 보면 GetType()이라는 함수가 있다. 얘는 우리가 정의하지도 않았는데 존재하는 것을 볼 수 있는데 왜 그러냐면 C#에서 우리가 만드는 모든 객체들은 다 Object 객체에서 파생되어서 나온거다. 그러니까 알게 모르게 이 GetType이라는 애를 다 들고 있다. 점을 찍어보면 GetType말고도 toString, GetHashCode, Equals 등 이라는 굉장히 묘한 아이들이 있는 것을 볼 수 있는데 얘내들이 모두 이 Object 라는 최상위 클래스 안에 있는 것이다. 어쨋은 GetType을 이용하면 type을 뺼 수 있다. 그 다음에 우리는 여기서 뭐 많은 걸 해보지 않고 이게 워낙 기능이 많아서 다 설명하기도 어려운데 그냥 정말 이 모든 정보를 다 빼놓을 수 있다고 보면 된다. 그러니까 이 클래스의 이름이 몬스터 인것도 알 수 있고, 얘가 갖고 있는 정보들이 뭐뭐 있는지도 알 수 있고, 어떤 함수를 들고 있는 지도 알 수 있고, 그냥 말 그대로 모든 정보를 빼올 수 있다.
var fields = type.GetFields(System.Reflection.BindingFlags.Public
| System.Reflection.NonPublic
| System.Reflection.BindingFlags.Static
| System.Reflection.BindingFlags.Instance);
foreach(FieldInfo field in fields)
{
string access = "protected";
if(field.IsPublic)
access = "public";
else if(field.IsPrivate)
access = "private";
Debug.Log($"{access} {field.FieldType.Name} {field.Name}");
여기서 중요한 것은 이렇게 정보를 런타임에 긁어올 수 있다는 것이다. 이거 외에도 정말 다양한 것들을 알 수 있어 결론은 그냥 reflection은 그냥 x-ray를 찍는 것이다라고 말할 수 있다.
이는 아직 C++ 언리얼에는 없고 C#에만 있는 기능이다.
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문 | Rookiss - 인프런
Rookiss | 기초 프로그래밍 지식이 없는 사람들을 위한 C# 프로그래밍 기초 강의입니다. 문법 암기 위주의 수업이 아니라, 최대한 필요한 부분만을 요약해서 진행합니다., MMORPG 개발에 필요한 모든
www.inflearn.com
'게임개발 > 스터디' 카테고리의 다른 글
[스터디] virtual / abstract / Interface 선언 (0) | 2024.06.05 |
---|---|
[스터디] 컴포넌트 패턴 (0) | 2024.06.05 |
[스터디] 내적 / 외적의 의미 (0) | 2024.05.13 |
[스터디] 유니티 이벤트 함수 호출 순서 (0) | 2024.05.13 |
[스터디] 사용해 본 디자인 패턴 정리 (0) | 2024.05.13 |