리플렉션(Reflection)은 프로그램이 실행되는 동안(런타임) 타입 정보를 얻기 위해 사용되는 강력한 기능입니다. 실행 중인 프로그램의 메타데이터에 접근할 수 있게 해주는 클래스들은 System.Reflection 네임스페이스에 포함되어 있습니다.
리플렉션의 주요 활용 분야
- 특성(Attribute) 정보 조회: 런타임에 클래스나 멤버에 적용된 특성 정보를 확인할 수 있습니다.
- 타입 검사 및 인스턴스화: 어셈블리 내부의 다양한 타입을 조사하고, 이를 동적으로 인스턴스화할 수 있습니다.
- 지연 바인딩(Late Binding): 컴파일 시점이 아닌 런타임에 메서드와 속성을 바인딩하여 호출할 수 있습니다.
- 동적 타입 생성: 런타임에 새로운 타입을 생성하고, 해당 타입을 사용해 다양한 작업을 수행할 수 있습니다.
System.Reflection 네임스페이스에는 애플리케이션에 대한 정보를 얻거나, 타입·값·객체를 애플리케이션에 동적으로 추가할 수 있도록 지원하는 클래스들이 포함되어 있습니다.
그럼 실제 예제를 통해 리플렉션이 어떻게 동작하는지 살펴보겠습니다.
먼저 대상 클래스의 MemberInfo 객체를 다음과 같이 설정합니다.
System.Reflection.MemberInfo info = typeof(MyClass);
아래는 전체 예제 코드입니다.
예제
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute {
public readonly string Url;
public string Topic {
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();
}
}
}위 예제에서는 MyClass 클래스에 HelpAttribute라는 사용자 정의 특성을 적용한 후, 리플렉션을 통해 해당 특성을 런타임에 조회하고 출력합니다. GetCustomAttributes(true) 메서드는 클래스에 적용된 모든 특성을 배열 형태로 반환하며, 반복문을 통해 각 특성을 콘솔에 출력합니다.
실행 결과
HelpAttribute