C# 리플렉션(Reflection)이란?
리플렉션(Reflection)은 프로그램이 런타임에 자신의 타입 정보를 동적으로 조회할 수 있게 해주는 C#의 강력한 기능입니다. 이를 활용하면 코드가 컴파일된 이후에도 어셈블리, 모듈, 클래스 등의 메타데이터를 검사하고 활용할 수 있습니다.
실행 중인 프로그램의 메타데이터에 접근할 수 있는 클래스들은 모두 System.Reflection 네임스페이스에 포함되어 있습니다.
MemberInfo 객체 초기화하기
클래스와 연관된 특성(Attribute)을 조사하려면 먼저 System.Reflection의 MemberInfo 객체를 초기화해야 합니다. 아래 코드는 대상 클래스인 MyClass의 타입 정보를 담은 객체를 설정하는 기본적인 방법입니다.
System.Reflection.MemberInfo info = typeof(MyClass);전체 예제 코드
다음은 사용자 지정 특성(HelpAttribute)을 정의한 뒤, 리플렉션을 통해 MyClass 클래스에 적용된 특성 정보를 읽어오는 전체 예제입니다.
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute {
public readonly string Url;
public string Topic { // Topic은 명명된 매개변수(named parameter)
get {
return topic;
}
set {
topic = value;
}
}
public HelpAttribute(string url) { // url은 위치 매개변수(positional parameter)
this.Url = url;
}
private string topic;
}
[HelpAttribute("Information on the class MyClass")]
class MyClass {
}
namespace AttributeAppl {
class Program {
static void Main(string[] args) {
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();
}
}
}코드 동작 원리
위 예제의 핵심 흐름은 다음과 같습니다.
- 사용자 지정 특성 정의: System.Attribute를 상속하여 HelpAttribute를 만듭니다. 생성자의 url 매개변수는 위치 매개변수(positional parameter)이며, Topic 속성은 명명된 매개변수(named parameter)로 동작합니다.
- 특성 적용: [HelpAttribute(...)] 구문을 사용해 MyClass 클래스에 특성을 부착합니다.
- 리플렉션으로 조회: typeof(MyClass)로 MemberInfo 객체를 얻은 후, GetCustomAttributes(true) 메서드를 호출하면 해당 클래스에 적용된 모든 특성이 배열 형태로 반환됩니다.
- 결과 출력: for 루프를 돌며 각 특성 정보를 콘솔에 출력합니다.
리플렉션의 활용 분야
이처럼 리플렉션을 활용하면 런타임에 타입의 특성, 메서드, 속성 등 다양한 메타데이터에 접근할 수 있습니다. 덕분에 플러그인 시스템, 직렬화/역직렬화, 의존성 주입(DI) 컨테이너, ORM 프레임워크 등 유연성이 필요한 다양한 시나리오에서 널리 사용되고 있습니다. 다만 리플렉션은 일반적인 직접 호출보다 성능 오버헤드가 크므로, 필요한 경우에만 신중하게 사용하는 것이 좋습니다.