"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

소프트웨어 공학/코딩

리플렉션 Reflection

허민영 2025. 4. 24. 20:43

**리플렉션(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. 사용 시 주의점

  • 성능 이슈: 리플렉션은 일반 메서드 호출보다 느립니다. 반복적으로 호출되는 로직에서 사용하면 성능 저하를 일으킬 수 있으므로 캐싱하거나 초기화 시점에만 사용하도록 제한하는 것이 좋습니다.
  • 안전성 저하: 컴파일 타임 검증이 어렵기 때문에, 타입이나 멤버 이름이 변경되면 런타임 오류로 이어질 수 있습니다.
  • 보안 이슈: 외부 입력 기반으로 리플렉션을 사용할 경우 보안 취약점이 생길 수 있습니다.

결론

리플렉션은 동적 유연성을 제공하는 강력한 도구지만, 그만큼 성능과 안전성 비용이 존재합니다. 툴 개발, 프레임워크 자동화, 디버깅 편의성 확보 등에서 매우 유용하지만, 실시간 로직에서는 최대한 초기화 시점에 제한적으로 사용하는 것이 일반적인 권장 패턴입니다.