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);
}
}
리플렉션 활용 사례
리플렉션은 일반적으로 다음과 같은 경우에 활용됩니다.
- 프레임워크 및 라이브러리 개발
- JSON 직렬화/역직렬화
- ORM(Entity Framework, Dapper 등)
- 의존성 주입(DI) 컨테이너
- 플러그인 시스템
- 런타임에서 외부 어셈블리를 로드하여 동적으로 실행
- 단위 테스트 및 목(Mock) 객체 생성
- 테스트 프레임워크에서 리플렉션을 이용하여 테스트 대상 객체를 조작
- 자동화 도구 개발
- 클래스 정보를 기반으로 문서를 자동 생성
리플렉션 사용 시 주의할 점
- 성능 문제: 리플렉션은 일반적인 코드 실행보다 속도가 느리므로 과도한 사용을 피해야 합니다.
- 캡슐화 침해 가능성: private 필드나 메서드에 접근하면 객체의 내부 구현이 노출될 수 있습니다.
- 보안 문제: 외부에서 조작할 경우 보안 취약점이 발생할 수 있으므로 신중히 사용해야 합니다.
Q&A
Q: C#에서 리플렉션이 무엇인가요?
A: 리플렉션은 런타임에 타입 정보를 조사하고 객체를 동적으로 조작할 수 있는 기능입니다.
Q: 리플렉션을 사용할 때 주의해야 할 점은?
A: 성능 저하, 캡슐화 침해, 보안 문제를 고려해야 합니다.
Q: 리플렉션은 어떤 경우에 사용하나요?
A: JSON 직렬화, ORM, 플러그인 시스템, 자동화 도구 개발 등에서 활용됩니다.
결론
C#의 리플렉션은 런타임에서 객체를 동적으로 조작할 수 있는 강력한 기능을 제공합니다. 하지만 성능 저하 및 보안 문제를 고려해야 하므로 필요할 때만 신중하게 사용하는 것이 좋습니다. 🎯