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 - 클래스 구성 요소를 정의하는 데 도움이 됩니다. 클래스 선언에 명시되어 있습니다.
아래 매크로는 클래스를 설명하는 데 사용할 수 있습니다.
RTTI_FIELD- 이 필드는 스칼라 또는 구조가 스칼라인지 또는 구조인지 지정합니다.RTTI_PTR- 이 필드는 언급된 스칼라 또는 구조에 대한 포인터를 설명합니다.RTTI_PTR_PTR-PTR TO PTR매크로는RTTI_FIELD매크로에 대한 이중 포인터입니다.RTTI_ARRAY- 이 매크로는 1차원 스칼라, 클래스 또는 구조 배열을 생성합니다.
클래스의 두 번째 매개변수는 해당 필드에 대한 플래그 또는 한정자를 요청합니다. 위의 매크로에 사용된 일부 플래그는 다음과 같습니다.
RTTI_FLD_INSTANCERTTI_FLD_STATICRTTI_FLD_CONSTRTTI_FLD_PUBLICRTTI_FLD_PROTECTEDRTTI_FLD_PRIVATERTTI_FLD_VIRTUALRTTI_FLD_VOLATILERTTI_FLD_TRANSIENT
C++에서 리플렉션이 작동하는 방식
C++에서 리플렉션을 사용하면 애플리케이션에서 사용된 표현식이 유효한지 여부를 빠르게 확인할 수 있습니다. 또한 개체에 표시된 멤버 변수/메서드가 포함되어 있는지 여부를 확인하는 데 도움이 됩니다.
리플렉션 API는 프로그램이 실행되는 동안 모든 정보를 수집하고 클래스의 멤버 변수 및 메서드에 대한 모든 정보를 포함하는 클래스 설명자를 만듭니다.
컴파일러는 이 클래스 설명자를 사용하여 변수와 메서드가 특정 클래스에 속하는지 여부와 주어진 식이 합법적인지 여부를 확인합니다.
C++에는 다음을 포함하여 런타임 동안 객체의 형식을 결정하는 몇 가지 방법이 있습니다.
- 디버깅 데이터를 검사합니다.
- 클래스 설명자를 생성하기 위해 C++ 소스를 구문 분석하는 사용자 지정 전처리기를 사용합니다.
- 프로그래머가 수동으로 해야 합니다.
반사의 장단점
- 디버깅 정보 추출 -
reflectionAPI를 사용하면 애플리케이션에서 사용되는 개체 유형에 대한 모든 관련 정보를 쉽게 추출할 수 있습니다. 이 기능을 사용할 때 응용 프로그램을 수정하지 않도록 주의해야 합니다. - 추가 단계가 필요하지 않습니다. - 개체의 형식 유형에 대한 정보를 얻기 위해 리플렉션 기능을 사용할 때 런타임 유형 정보를 생성하기 위해 추가 절차가 필요하지 않습니다.
- 효율적인 코드 생성 - 애플리케이션의
ReflectionAPI는 리플렉션 방법에 대한 효율적인 코드 생성을 돕습니다. - 변수 및 인스턴스 메서드 액세스 - 클래스에서
reflectionAPI에 의해 반환된 디스크립터를 사용하여 클래스 변수에 쉽게 액세스하고 클래스 인스턴스 메서드를 활성화할 수 있습니다.
리플렉션은 런타임 동안 개체의 유형을 결정하는 데 유용한 도구입니다. 이 정보는 호출, 디버깅, 원격 메서드, 직렬화 등과 같은 활동에 유용합니다.
이것은 이름으로 응용 프로그램에서 항목을 찾거나 모든 구성 요소를 반복해야 하는 경우에도 유용합니다.