[로봇활용_12주차] C# 리플렉션, Microsoft Learn으로 파헤치자!

최윤호·2025년 10월 31일
post-thumbnail

개발자의 나침반: Microsoft Learn

C#의 리플렉션(Reflection)에 대한 개념은 이해했는데,
막상 "어떤 코드를 써야 하는 거지?"라는 궁금증이 드셨나요?
이번 글에서는 그 궁금증을 해결해 줄 개발자의 가장 든든한 친구,
Microsoft Learn에 대해 알아보고, 리플렉션의 핵심을 소개해 드릴게요!

1)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은 더 넓은 범위의 학습 경험을 제공하는 현대적인 플랫폼입니다.

2)리플렉션의 핵심: System.Type

리플렉션의 모든 것은 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이 이 메소드를 유용하게 사용하죠.

3)코드로 직접 확인해보기

간단한 예제 클래스를 만들고, 위에서 소개한 메소드들을 이용해 정보를 조회해 볼까요?

[코드]

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: "이 클래스는 곧 지원이 중단될 예정입니다."

4)정리하며

개발자의 나침반 Microsoft Learn과 리플렉션의 핵심인 Type클래스에 대해 알아보았습니다.
System.Type클래스를 통해 설계도(메소드, 속성 등)를 런타임에 훤히 들여다볼 수 있었죠.

profile
🚀 미래의 엔지니어를 꿈꾸는 훈련생의 기록 📝

0개의 댓글