C++의 리플렉션

Muhammad Husnain 2023년10월12일
C++의 리플렉션

이 기사에서는 C++에서 Reflection, 목적 및 구현에 대해 설명합니다. 리플렉션 사용의 장단점을 자세히 살펴보겠습니다.

C++의 리플렉션

‘Reflection’은 모든 개체 유형에서 작동하는 일반 코드를 작성할 수 있게 해주는 프로그래밍 메커니즘입니다. 런타임에 클래스 개체의 형식을 감지하고 메서드를 호출하거나 데이터에 액세스하는 데 도움이 됩니다.

리플렉션은 해당 클래스에 대한 설명자가 반환되는 원격 메서드를 청구하는 데 유용합니다(클래스, 변수 및 메서드에 대한 정보 포함). 이러한 설명자는 인스턴스 메서드를 호출하고 해당 변수에 액세스하는 것을 간단하게 만듭니다.

리플렉션은 나중에 RTTI를 사용하여 C++로 구현되었습니다. 그러나 몇 가지 제한 사항만 있습니다.

아래는 Reflection의 구문을 보여주는 코드 스니펫입니다.

class demo {
 public:
  int a;
  char* p;
  double d;

 protected:
  long my_array[10];
  int** p1;

 public:
  RTTI_DESCRIBE_STRUCT((RTTI_FIELD(a, RTTI_FLD_PUBLIC),
                        RTTI_PTR(p, RTTI_FLD_PUBLIC),
                        RTTI_FIELD(d, RTTI_FLD_PUBLIC),
                        RTTI_ARRAY(my_array, RTTI_FLD_PROTECTED),
                        RTTI_PTR_TO_PTR(p1, RTTI_FLD_PROTECTED)));
};

위의 reflection 구문은 다양한 플래그를 사용하여 클래스 설명자를 설명합니다. 알 수 있듯이 두 가지 유형의 매크로가 사용됩니다.

RTTI DESCRIBE STRUCT - 클래스 구성 요소를 정의하는 데 도움이 됩니다. 클래스 선언에 명시되어 있습니다.

아래 매크로는 클래스를 설명하는 데 사용할 수 있습니다.

  1. RTTI_FIELD - 이 필드는 스칼라 또는 구조가 스칼라인지 또는 구조인지 지정합니다.
  2. RTTI_PTR - 이 필드는 언급된 스칼라 또는 구조에 대한 포인터를 설명합니다.
  3. RTTI_PTR_PTR - PTR TO PTR 매크로는 RTTI_FIELD 매크로에 대한 이중 포인터입니다.
  4. RTTI_ARRAY - 이 매크로는 1차원 스칼라, 클래스 또는 구조 배열을 생성합니다.

클래스의 두 번째 매개변수는 해당 필드에 대한 플래그 또는 한정자를 요청합니다. 위의 매크로에 사용된 일부 플래그는 다음과 같습니다.

  1. RTTI_FLD_INSTANCE
  2. RTTI_FLD_STATIC
  3. RTTI_FLD_CONST
  4. RTTI_FLD_PUBLIC
  5. RTTI_FLD_PROTECTED
  6. RTTI_FLD_PRIVATE
  7. RTTI_FLD_VIRTUAL
  8. RTTI_FLD_VOLATILE
  9. RTTI_FLD_TRANSIENT

C++에서 리플렉션이 작동하는 방식

C++에서 리플렉션을 사용하면 애플리케이션에서 사용된 표현식이 유효한지 여부를 빠르게 확인할 수 있습니다. 또한 개체에 표시된 멤버 변수/메서드가 포함되어 있는지 여부를 확인하는 데 도움이 됩니다.

리플렉션 API는 프로그램이 실행되는 동안 모든 정보를 수집하고 클래스의 멤버 변수 및 메서드에 대한 모든 정보를 포함하는 클래스 설명자를 만듭니다.

컴파일러는 이 클래스 설명자를 사용하여 변수와 메서드가 특정 클래스에 속하는지 여부와 주어진 식이 합법적인지 여부를 확인합니다.

C++에는 다음을 포함하여 런타임 동안 객체의 형식을 결정하는 몇 가지 방법이 있습니다.

  1. 디버깅 데이터를 검사합니다.
  2. 클래스 설명자를 생성하기 위해 C++ 소스를 구문 분석하는 사용자 지정 전처리기를 사용합니다.
  3. 프로그래머가 수동으로 해야 합니다.

반사의 장단점

  1. 디버깅 정보 추출 - reflection API를 사용하면 애플리케이션에서 사용되는 개체 유형에 대한 모든 관련 정보를 쉽게 추출할 수 있습니다. 이 기능을 사용할 때 응용 프로그램을 수정하지 않도록 주의해야 합니다.
  2. 추가 단계가 필요하지 않습니다. - 개체의 형식 유형에 대한 정보를 얻기 위해 리플렉션 기능을 사용할 때 런타임 유형 정보를 생성하기 위해 추가 절차가 필요하지 않습니다.
  3. 효율적인 코드 생성 - 애플리케이션의 Reflection API는 리플렉션 방법에 대한 효율적인 코드 생성을 돕습니다.
  4. 변수 및 인스턴스 메서드 액세스 - 클래스에서 reflection API에 의해 반환된 디스크립터를 사용하여 클래스 변수에 쉽게 액세스하고 클래스 인스턴스 메서드를 활성화할 수 있습니다.

리플렉션은 런타임 동안 개체의 유형을 결정하는 데 유용한 도구입니다. 이 정보는 호출, 디버깅, 원격 메서드, 직렬화 등과 같은 활동에 유용합니다.

이것은 이름으로 응용 프로그램에서 항목을 찾거나 모든 구성 요소를 반복해야 하는 경우에도 유용합니다.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn