Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 리플렉션(Reflection) 완벽 가이드: 런타임 타입 정보 활용법

리플렉션(Reflection) 객체는 런타임에 타입 정보를 얻기 위해 사용됩니다. 실행 중인 프로그램의 메타데이터에 접근할 수 있게 해주는 클래스들은 모두 System.Reflection 네임스페이스에 포함되어 있습니다.

리플렉션의 주요 활용 분야

  • 런타임에 어트리뷰트(Attribute) 정보를 조회할 수 있습니다.
  • 어셈블리 내의 다양한 타입들을 검사하고, 해당 타입들의 인스턴스를 생성할 수 있습니다.
  • 메서드와 프로퍼티에 대한 지연 바인딩(Late Binding)을 수행할 수 있습니다.
  • 런타임에 새로운 타입을 생성한 후, 그 타입을 이용해 여러 작업을 수행할 수 있습니다.

예제 코드

다음 예제는 커스텀 어트리뷰트를 정의하고, 리플렉션을 통해 클래스에 적용된 어트리뷰트 정보를 런타임에 읽어오는 방법을 보여줍니다.

using System;

[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute {
    public readonly string Url;

    public string Topic // Topic은 명명된(named) 매개변수입니다.
    {
        get {
            return topic;
        }
        set {
            topic = value;
        }
    }

    public HelpAttribute(string url) // url은 위치 기반(positional) 매개변수입니다.
    {
        this.Url = url;
    }

    private string topic;
}

[HelpAttribute("Information on the class MyClass")]
class MyClass {
}

namespace AttributeAppl {
    class Program {
        static void Main(string[] args) {
            // MyClass 타입의 메타데이터 정보를 가져옵니다.
            System.Reflection.MemberInfo info = typeof(MyClass);
            object[] attributes = info.GetCustomAttributes(true);

            // 적용된 모든 어트리뷰트를 출력합니다.
            for (int i = 0; i < attributes.Length; i++) {
                System.Console.WriteLine(attributes[i]);
            }
            Console.ReadKey();
        }
    }
}

코드 설명

위 예제에서 HelpAttributeSystem.Attribute를 상속받아 정의한 커스텀 어트리뷰트입니다. 생성자 매개변수인 url은 위치 기반 매개변수이며, Topic 프로퍼티는 명명된 매개변수로 동작합니다.

Main 메서드에서는 typeof(MyClass)를 통해 MemberInfo 객체를 얻고, GetCustomAttributes(true) 메서드로 MyClass 클래스에 적용된 모든 어트리뷰트를 배열 형태로 가져옵니다. 이후 반복문을 통해 각 어트리뷰트를 콘솔에 출력하면, 실행 결과로 HelpAttribute에 전달된 문자열이 표시됩니다.

이처럼 리플렉션을 활용하면 코드가 컴파일된 이후에도 타입과 어트리뷰트 정보를 동적으로 확인할 수 있어, 플러그인 아키텍처, ORM, 직렬화 라이브러리 등 다양한 고급 시나리오에서 널리 사용됩니다.