본문 바로가기

카테고리 없음

리플렉션(Reflection) in C#

C#에서 리플렉션(Reflection) 은 런타임에 타입(metadata) 정보를 조사하고 객체를 동적으로 조작할 수 있는 기능을 의미합니다. 이를 활용하면 코드에서 특정 클래스, 메서드, 속성 등을 동적으로 분석하고 실행할 수 있습니다.

리플렉션(Reflection) 개념

C#의 리플렉션은 System.Reflection 네임스페이스에서 제공하며, 다음과 같은 작업을 수행할 수 있습니다.

  • 타입 정보 조회 (Type 객체 활용)
  • 어셈블리 정보 조회
  • 클래스의 필드, 속성, 메서드 접근 및 수정
  • 동적으로 메서드 실행
  • 객체 생성 및 조작

리플렉션 기본 사용법

리플렉션을 사용하려면 Type 클래스를 활용해야 합니다.

1. 타입 정보 조회

using System;

class Program
{
    static void Main()
    {
        Type type = typeof(string);  // string 타입의 Type 객체 생성
        Console.WriteLine($"타입 이름: {type.Name}");
        Console.WriteLine($"네임스페이스: {type.Namespace}");
        Console.WriteLine($"어셈블리: {type.Assembly.FullName}");
    }
}

2. 필드 및 속성 정보 가져오기

using System;
using System.Reflection;

class Person
{
    public string Name { get; set; }
    private int age = 30;
}

class Program
{
    static void Main()
    {
        Type type = typeof(Person);
        
        Console.WriteLine("📌 필드 목록:");
        foreach (var field in type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
        {
            Console.WriteLine($"- {field.Name} ({field.FieldType.Name})");
        }
        
        Console.WriteLine("\n📌 속성 목록:");
        foreach (var prop in type.GetProperties())
        {
            Console.WriteLine($"- {prop.Name} ({prop.PropertyType.Name})");
        }
    }
}

3. 메서드 정보 조회 및 실행

using System;
using System.Reflection;

class Calculator
{
    public int Add(int a, int b) => a + b;
}

class Program
{
    static void Main()
    {
        Type type = typeof(Calculator);
        MethodInfo method = type.GetMethod("Add");

        object instance = Activator.CreateInstance(type);
        object result = method.Invoke(instance, new object[] { 5, 10 });

        Console.WriteLine($"메서드 실행 결과: {result}");
    }
}

4. 동적 객체 생성 (Activator.CreateInstance)

using System;

class Person
{
    public string Name { get; set; }

    public Person()
    {
        Name = "홍길동";
    }
}

class Program
{
    static void Main()
    {
        Type type = typeof(Person);
        object obj = Activator.CreateInstance(type);

        Console.WriteLine($"객체 생성: {(obj as Person)?.Name}");
    }
}

5. 비공개(Private) 필드 및 메서드 접근

using System;
using System.Reflection;

class Secret
{
    private string hiddenMessage = "비밀 메시지";

    private void SecretMethod()
    {
        Console.WriteLine("🔒 비공개 메서드 실행됨!");
    }
}

class Program
{
    static void Main()
    {
        Type type = typeof(Secret);
        object instance = Activator.CreateInstance(type);

        // 비공개 필드 접근
        FieldInfo field = type.GetField("hiddenMessage", BindingFlags.NonPublic | BindingFlags.Instance);
        Console.WriteLine($"비공개 필드 값: {field.GetValue(instance)}");

        // 비공개 메서드 실행
        MethodInfo method = type.GetMethod("SecretMethod", BindingFlags.NonPublic | BindingFlags.Instance);
        method.Invoke(instance, null);
    }
}

리플렉션 활용 사례

리플렉션은 일반적으로 다음과 같은 경우에 활용됩니다.

  1. 프레임워크 및 라이브러리 개발
    • JSON 직렬화/역직렬화
    • ORM(Entity Framework, Dapper 등)
    • 의존성 주입(DI) 컨테이너
  2. 플러그인 시스템
    • 런타임에서 외부 어셈블리를 로드하여 동적으로 실행
  3. 단위 테스트 및 목(Mock) 객체 생성
    • 테스트 프레임워크에서 리플렉션을 이용하여 테스트 대상 객체를 조작
  4. 자동화 도구 개발
    • 클래스 정보를 기반으로 문서를 자동 생성

리플렉션 사용 시 주의할 점

  • 성능 문제: 리플렉션은 일반적인 코드 실행보다 속도가 느리므로 과도한 사용을 피해야 합니다.
  • 캡슐화 침해 가능성: private 필드나 메서드에 접근하면 객체의 내부 구현이 노출될 수 있습니다.
  • 보안 문제: 외부에서 조작할 경우 보안 취약점이 발생할 수 있으므로 신중히 사용해야 합니다.

Q&A

Q: C#에서 리플렉션이 무엇인가요?
A: 리플렉션은 런타임에 타입 정보를 조사하고 객체를 동적으로 조작할 수 있는 기능입니다.

Q: 리플렉션을 사용할 때 주의해야 할 점은?
A: 성능 저하, 캡슐화 침해, 보안 문제를 고려해야 합니다.

Q: 리플렉션은 어떤 경우에 사용하나요?
A: JSON 직렬화, ORM, 플러그인 시스템, 자동화 도구 개발 등에서 활용됩니다.

결론

C#의 리플렉션은 런타임에서 객체를 동적으로 조작할 수 있는 강력한 기능을 제공합니다. 하지만 성능 저하 및 보안 문제를 고려해야 하므로 필요할 때만 신중하게 사용하는 것이 좋습니다. 🎯