게임개발/스터디

[스터디] Reflection(리플렉션)

감물 2024. 5. 14. 14:29

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#에만 있는 기능이다.

 

 

 

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1/dashboard

 

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문 | Rookiss - 인프런

Rookiss | 기초 프로그래밍 지식이 없는 사람들을 위한 C# 프로그래밍 기초 강의입니다. 문법 암기 위주의 수업이 아니라, 최대한 필요한 부분만을 요약해서 진행합니다., MMORPG 개발에 필요한 모든

www.inflearn.com