
C#의 리플렉션(Reflection)에 대한 개념은 이해했는데,
막상 "어떤 코드를 써야 하는 거지?"라는 궁금증이 드셨나요?
이번 글에서는 그 궁금증을 해결해 줄 개발자의 가장 든든한 친구,
Microsoft Learn에 대해 알아보고, 리플렉션의 핵심을 소개해 드릴게요!
마이크로소프트가 직접 운영하는 온라인 학습 플랫폼입니다.
마이크로소프트의 거의 모든 기술(C#, F#, Azure 등)을 무료로 배울 수 있는 곳입니다.
C#에서 제공하는 기능이 궁금할 때 가장 먼저 찾아봐야 할 곳이죠.
한국어 링크
https://learn.microsoft.com/ko-kr/
영어 링크
https://learn.microsoft.com/en-us/
MSDN과의 차이점
MSDN은 과거 개발자들을 위해 상세한 기술 설명을 제공했습니다.
특정 기술이나 API를 어떻게 사용하는지 찾아보는 '참조' 목적이 강했습니다.
현재 MSDN의 모든 기술 문서는 Microsoft Learn으로 이전 및 통합되었습니다.
Microsoft Learn은 더 넓은 범위의 학습 경험을 제공하는 현대적인 플랫폼입니다.
리플렉션의 모든 것은 System.Type클래스에서 시작됩니다.
System.Type클래스는 모든 형식의 '설계도' 정보를 담고 있습니다.
여러분이 Microsoft Learn에서 System.Type을 직접 검색해 보면,
이 클래스가 제공하는 수많은 메소드와 속성 목록을 확인할 수 있습니다.
그중에서도 리플렉션을 사용할 때 비교적 자주 마주치게 될 핵심 메소드를 살펴보겠습니다.
1. GetType() & typeof() - 타입 정보 가져오기
가장 먼저, 정보(메타데이터)를 조회할 대상의 Type객체를 얻어와야 합니다.
object.GetType(): 인스턴스(객체)가 이미 있을 때, 그 객체로부터Type정보를 가져옵니다. 런타임에 객체의 실제 타입을 확인할 때 유용합니다.typeof(ClassName): 클래스 이름을 코드에 명시하여 Type정보를 가져옵니다.2. GetMethods() - 메소드 정보 가져오기
해당 타입에 정의된 모든 public메소드의 정보를 배열(MethodInfo[])로 반환합니다.
여기서 GetMethods()에 BindingFlags라는 열거형(enum)을 사용하여
private메소드, static메소드 등 특정 조건의 메소드만 필터링해서 가져올 수 있습니다.
3. GetProperties() - 속성 정보 가져오기
해당 타입의 정의된 모든 public속성 정보를 배열(PropertyInfo[])로 반환합니다.
4. GetConstructors() - 생성자 정보 알아내기
해당 타입의 public생성자 정보를 배열(ConstructorInfo[])로 반환합니다.
이 정보가 있으면, 우리는 런타임에 동적으로 객체를 생성할 수 있게 됩니다.
5. GetCustomAttributes() - 애트리뷰트 정보 확인하기
클래스나 메소드, 속성 등에 붙어있는 애트리뷰트([Obsolete], [Serializable]등)
정보를 가져옵니다. 유닛 테스트 프레임워크나 ORM이 이 메소드를 유용하게 사용하죠.
간단한 예제 클래스를 만들고, 위에서 소개한 메소드들을 이용해 정보를 조회해 볼까요?
[코드]
using System;
using System.Reflection;
[Obsolete("이 클래스는 곧 지원이 중단될 예정입니다.")]
public class PluginService
{
private int _version = 1;
public string ServiceName { get; set; }
public PluginService(string serviceName)
{
ServiceName = serviceName;
}
public void Execute()
{
Console.WriteLine($"{ServiceName} (버전: {_version}) 플러그인을 실행합니다.");
}
private void Log(string message)
{
Console.WriteLine($"[로그]: {message}");
}
}
class Program
{
static void Main()
{
// 1. typeof 키워드를 이용해 Type 정보 가져오기
Type pluginType = typeof(PluginService);
Console.WriteLine($"--- [{pluginType.Name}] 클래스 정보 조회 ---");
// 2. GetConstructors: 생성자 정보 확인
Console.WriteLine("\n[생성자 목록]");
ConstructorInfo[] constructors = pluginType.GetConstructors();
foreach (var constructor in constructors)
{
Console.WriteLine($"- {constructor.Name}");
}
// 3. GetProperties: 속성 정보 확인
Console.WriteLine("\n[속성 목록]");
PropertyInfo[] properties = pluginType.GetProperties();
foreach (var property in properties)
{
Console.WriteLine($"- {property.PropertyType.Name} {property.Name}");
}
// 4. GetMethods: public 메소드 정보 확인
Console.WriteLine("\n[Public 메소드 목록]");
MethodInfo[] publicMethods =
pluginType.GetMethods(
BindingFlags.Public | // public으로 선언된 메서드
BindingFlags.Instance | // 인스턴스에 속하는 메서드
BindingFlags.DeclaredOnly); // 해당 클래스에 선언된 메서드
foreach (var method in publicMethods)
{
Console.WriteLine($"- {method.Name}");
}
// 5. GetCustomAttributes: 클래스에 붙은 애트리뷰트 확인
Console.WriteLine("\n[애트리뷰트 목록]");
var attributes = pluginType.GetCustomAttributes(false);
foreach (var attribute in attributes)
{
if (attribute is ObsoleteAttribute obsolete)
{
Console.WriteLine($"- Obsolete: \"{obsolete.Message}\"");
}
}
}
}
실행 결과:
--- [PluginService] 클래스 정보 조회 ---
[생성자 목록]
- .ctor
[속성 목록]
- String ServiceName
[Public 메소드 목록]
- get_ServiceName
- set_ServiceName
- Execute
[애트리뷰트 목록]
- Obsolete: "이 클래스는 곧 지원이 중단될 예정입니다."
개발자의 나침반 Microsoft Learn과 리플렉션의 핵심인 Type클래스에 대해 알아보았습니다.
System.Type클래스를 통해 설계도(메소드, 속성 등)를 런타임에 훤히 들여다볼 수 있었죠.