HOWTO · C++

C++의 리플렉션

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에 의해 반환된 디스크립터를 사용하여 클래스 변수에 쉽게 액세스하고 클래스 인스턴스 메서드를 활성화할 수 있습니다.

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

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