728x90
반응형

Qt 리플렉션(Reflection) 기능

  • Qt에서는 리플렉션(Reflection) 기능을 지원하기 위해 자체적인 메타 오브젝트 시스템(Meta-Object System)을 제공합니다.
  • 이를 통해 런타임에 객체의 타입 정보와 메서드, 속성, 신호 및 슬롯 등에 대한 정보를 동적으로 확인하고 조작할 수 있습니다.

Qt의 리플렉션 주요 기능

    1. 메타 오브젝트 시스템 (Meta-Object System)
    • 클래스에 메타데이터를 추가하여 런타임에 해당 클래스의 정보를 확인할 수 있습니다.
    • 이를 위해 클래스는 반드시 Q_OBJECT 매크로를 선언해야 하며, Qt의 moc(Meta-Object Compiler)를 통해 메타데이터가 생성됩니다.
    1. QMetaObject
    • 객체의 메타정보(클래스 이름, 메서드, 신호/슬롯, 속성 등)를 제공하는 클래스입니다.
    • 모든 QObject 기반 클래스는 metaObject() 메서드를 통해 해당 객체의 메타정보를 확인할 수 있습니다.
    1. QMetaMethod, QMetaProperty
    • 메서드 및 속성 정보를 표현하는 클래스입니다.
    • 이를 통해 런타임에 메서드 호출이나 속성 접근이 가능합니다.

리플렉션 사용 예제

1. 클래스 메타정보 확인

cpp

#include <QObject>
#include <QMetaObject>
#include <QMetaMethod>
#include <QDebug>

class MyClass : public QObject {
    Q_OBJECT
public:
    Q_INVOKABLE void myMethod() { qDebug() << "myMethod called"; }
    Q_PROPERTY(int myProperty READ myProperty WRITE setMyProperty)

    int myProperty() const { return m_myProperty; }
    void setMyProperty(int value) { m_myProperty = value; }

private:
    int m_myProperty;
};

int main() {
    MyClass obj;

    const QMetaObject *metaObject = obj.metaObject();
    qDebug() << "Class Name:" << metaObject->className();

    // 메서드 나열
    qDebug() << "Methods:";
    for (int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i) {
        QMetaMethod method = metaObject->method(i);
        qDebug() << method.methodSignature();
    }

    // 속성 나열
    qDebug() << "Properties:";
    for (int i = metaObject->propertyOffset(); i < metaObject->propertyCount(); ++i) {
        QMetaProperty property = metaObject->property(i);
        qDebug() << property.name() << "Type:" << property.typeName();
    }

    return 0;
}

2. Q_INVOKABLE 메서드 호출

cpp

const QMetaObject *metaObject = obj.metaObject();
int methodIndex = metaObject->indexOfMethod("myMethod()");
if (methodIndex >= 0) {
    QMetaMethod method = metaObject->method(methodIndex);
    method.invoke(&obj); // myMethod called 출력
}

3. Q_PROPERTY 사용

? cpp

const QMetaProperty property = metaObject->property(metaObject->indexOfProperty("myProperty"));
if (property.isValid()) {
    property.write(&obj, 42); // myProperty에 42를 설정
    int value = property.read(&obj).toInt();
    qDebug() << "myProperty Value:" << value; // 42 출력
}

Qt 리플렉션의 특징

    1. Q_OBJECT 매크로 필수
    • 메타 오브젝트 기능을 사용하려면 클래스에 Q_OBJECT 매크로를 추가해야 합니다.
    • Q_INVOKABLE, Q_PROPERTY 같은 키워드를 활용하여 메타정보를 정의할 수 있습니다.
    1. 제한점
    • Qt의 리플렉션은 런타임 메타데이터에 기반하며, Java/C#의 리플렉션처럼 모든 클래스에 적용되지는 않습니다.
    • 즉, QObject를 상속하지 않는 클래스는 메타 오브젝트 시스템에 포함되지 않습니다.
    1. 확장성
    • Qt의 메타 오브젝트 시스템은 런타임 객체 관리, 신호/슬롯 연결, 동적 속성 관리 등과 밀접하게 통합되어 있어 매우 유용합니다.

실용적 사용 사례

    1. UI 빌더 및 데이터 바인딩
    • QML과의 연동에서 Q_PROPERTY를 활용해 동적으로 속성 업데이트.
    1. 플러그인 시스템
    • 런타임에 플러그인 메서드와 속성을 동적으로 검색하고 호출.
    1. 동적 객체 생성
    • QMetaObject::newInstance()를 통해 객체를 동적으로 생성.
    1. 테스트 및 디버깅
    • 클래스 메타데이터를 출력하여 디버깅 정보를 확인하거나 테스트에 활용.
728x90
반응형

+ Recent posts