Game Tech Blog

C# - 리플렉션(Reflection) 본문

IT Study/C#

C# - 리플렉션(Reflection)

jonghow 2023. 9. 26. 04:35
반응형

리플렉션 이란?

C# 에서는 어플리케이션 실행 도중에 객체의 정보를 확인하기 위한 기능이다.

객체의 정보는 주로 메서드, 프로퍼티, 생성자등 인스턴스 데이터 타입 정보를 통칭한다.

 

예를들어, 내가 지금 제네릭 클래스를 원소로 List 등 자료구조를 사용하고 있을때, 내가 A 클래스를 쓰고 있는지 B 클래스를 쓰고 있는지 알 수 없는데, 리플렉션에 있는 GetType() 을 사용하면 내가 현재 쓰고 있는 클래스 형태를 알 수 있다.

 

그렇다면, 리플렉션은 어떻게 사용되어야 효율적인가?

런타임 시점에서 테스트 및 디버깅 목적으로 객체의 동작을 분석하거나, 테스트 용도로 사용되면 가장 베스트다.

이는 리플렉션은 테스트 용도로 사용하고 실제 프로그램 개발단에서는 리플렉션을 이용한 로직은 최대한 지양해야 한다는 의미다. 

 

리플렉션의 최대 단점이 아래와 같이 있기 때문이다.

1) 알 수 없는 객체를 처리하기 위한 비효율

2) 런타임 시간에 활용할 수 있는 기능이기 때문에 컴파일 단에서 확인할 수 없다는 점

3) 클래스 내부 정보를 찾아 들어가 객체 지향 프로그래밍의 특징을 위배 (추상화)

 

리플렉션의 주된 메서드로는 무엇이 있는가?

Type 클래스 내부에는 많은 함수 등을 제공하나 대표적으로 사용하는 함수들을 몇가지 꼽아볼 수 있다.

Method Return Type Description
GetType() Type 데이터의 Type 개체를 반환합니다.
GetMembers() MemberInfo[] 데이터의 필드 목록을 반환합니다.
GetMethods() MethodInfo[] 지정된 바인딩 제약조건과 일치하는 메서드를 반환합니다.
GetFields() FiledInfo[] 현재 Type의 모든 public 필드를 반환합니다.

이외에도 MSDN에 강력한 기능을 많이 제공하고 있는데, MSDN 을 들어가서 확인하는 것도 좋은 방법인 것 같다.

 

리플렉션 함수, GetFields() 

    class TestClass
    {
        public int Value;
        public string Name;
    }


    class Program
    {
        static void Main(string[] args)
        {
            var test = new TestClass();

            Type type = test.GetType();
            FieldInfo[] fields = type.GetFields();

            for(int i = 0; i < fields.Length; ++i)
            {
                var vFields = fields[i];
                if (vFields == null) continue;
                Console.WriteLine($"Type : {vFields.FieldType}, Name : {vFields.Name}");
            }
        }
    }

[결과] 

Type : System.Int32, Name : Value
Type : System.String, Name : Name

테스트 하면서 한가지 알게된 점은 접근 제어자가 public 일때 Getfields()로 가져올 수 있다는 점이다.

BindingFlags로 필드의 속성을 가져올 수 있는 방법이 제공되고 있는것 같은데, 사용법이 정확하지 않아 제대로 가져오지 못하는 이슈가 있긴하나, GetFields()는 public 변수를 Default로 가져오고 있음을 알 수 있다.

 

 

참고

https://learn.microsoft.com/ko-kr/dotnet/api/system.type.getfields?view=net-7.0#system-type-getfields(system-reflection-bindingflags) 

 

Type.GetFields 메서드 (System)

현재 Type의 필드를 가져옵니다.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/dotnet/api/system.type?view=net-7.0&redirectedfrom=MSDN 

 

Type 클래스 (System)

클래스 형식, 인터페이스 형식, 배열 형식, 값 형식, 열거형 형식, 형식 매개 변수, 제네릭 형식 정의 및 개방형 생성 제네릭 형식이나 폐쇄형 생성 제네릭 형식에 대한 형식 선언을 나타냅니다.

learn.microsoft.com

 

반응형

'IT Study > C#' 카테고리의 다른 글

C# - ref, out, in 한정자  (0) 2023.09.25
C# - Partial 클래스  (0) 2022.09.27
C# - Boxing, UnBoxing  (0) 2022.04.08
C# - Enum To String ( 열거형 내용을 문자열로 변환)  (0) 2022.04.05
C# - 프로퍼티  (0) 2022.01.11
Comments