**리플렉션(Reflection)**은 C#을 포함한 .NET 언어에서 런타임에 타입의 메타데이터에 접근하고, 객체의 구조나 멤버를 동적으로 탐색하거나 조작할 수 있는 기능입니다. 정적인 코드 작성 시점이 아닌, 실행 중에 클래스, 메서드, 필드, 속성 등에 접근할 수 있게 해주기 때문에, 매우 유연하고 강력한 기능입니다.
1. 리플렉션이 무엇인가?
정확히 말하면 System.Reflection 네임스페이스에 포함된 클래스들을 이용해 다음과 같은 작업을 수행할 수 있습니다:
- 특정 타입의 정보(Type, MethodInfo, PropertyInfo 등) 조회
- 인스턴스 생성 (Activator.CreateInstance)
- 메서드 호출 (MethodInfo.Invoke)
- 필드/속성 값 읽기 또는 쓰기 (FieldInfo.GetValue, PropertyInfo.SetValue)
즉, 코드의 구조를 문자열이나 런타임 객체 기반으로 다룰 수 있게 해주는 기능입니다.
2. 리플렉션을 사용한 대표적인 이유들
(1) 프레임워크 혹은 툴 개발
유니티 에디터 확장, 커스텀 인스펙터 제작, 오브젝트 자동 등록기 등에서 널리 사용됩니다.
// 모든 타입 중에서 ICustomHandler 인터페이스를 구현한 클래스 자동 등록
var types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => typeof(ICustomHandler).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);
foreach (var type in types)
{
var handler = Activator.CreateInstance(type) as ICustomHandler;
handler?.Register();
}
(2) 직렬화 / 역직렬화 구현
필드 정보를 동적으로 읽어 JSON, 바이너리 포맷 등으로 변환하거나, 반대로 데이터를 객체에 주입할 때 사용합니다. Unity에서도 ScriptableObject를 수동 생성하거나 데이터를 불러올 때 활용합니다.
(3) 속성(Attribute) 기반 자동 처리
특정 Attribute가 붙은 필드나 메서드를 찾아서, 그에 맞는 자동 로직을 실행할 수 있습니다.
// [AutoRegister]가 붙은 모든 클래스 인스턴스 생성 및 등록
var types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.GetCustomAttribute<AutoRegisterAttribute>() != null);
(4) 디버깅/로깅/개발툴
런타임에서 객체의 내부 상태를 시각화하거나 특정 조건을 자동 점검할 때 사용됩니다. 유니티에서 디버깅 UI에 내부 모델 상태를 보여주는 데에도 활용할 수 있습니다.
3. 사용 시 주의점
- 성능 이슈: 리플렉션은 일반 메서드 호출보다 느립니다. 반복적으로 호출되는 로직에서 사용하면 성능 저하를 일으킬 수 있으므로 캐싱하거나 초기화 시점에만 사용하도록 제한하는 것이 좋습니다.
- 안전성 저하: 컴파일 타임 검증이 어렵기 때문에, 타입이나 멤버 이름이 변경되면 런타임 오류로 이어질 수 있습니다.
- 보안 이슈: 외부 입력 기반으로 리플렉션을 사용할 경우 보안 취약점이 생길 수 있습니다.
결론
리플렉션은 동적 유연성을 제공하는 강력한 도구지만, 그만큼 성능과 안전성 비용이 존재합니다. 툴 개발, 프레임워크 자동화, 디버깅 편의성 확보 등에서 매우 유용하지만, 실시간 로직에서는 최대한 초기화 시점에 제한적으로 사용하는 것이 일반적인 권장 패턴입니다.
'소프트웨어 공학 > 코딩' 카테고리의 다른 글
| Unity] HealthBar 최적화 (0) | 2025.04.28 |
|---|---|
| TCP와 UDP비교 (0) | 2025.04.25 |
| 박싱과 언박싱에 메모리에서 일어나는 과정 (0) | 2025.04.23 |
| Unity] GetComponent를 최소한으로 사용해야하는 이유 (0) | 2025.04.22 |
| Unity] Assembly Definition (0) | 2025.04.21 |