Meta-Object System

Meta-Object System은 Qt Framework의 일부분으로,

Object 간 통신 메커니즘을 위한 Signal/Slot, 런타임 정보, 동적 프로퍼티 시스템을 제공합니다.

Meta-Object System은 아래의 3가지 기능을 기반으로 지원합니다.

 

1. QObject 클래스 Meta-Object System을 이용할 수 있는 Object에 대한 Base 클래스를 제공합니다.

2. 클래스의 Private 영역에 선언된 Q_OBJECT 매크로는 동적 프로퍼티, Signal / Slot 등의 Meta-Object 기능을 사용할 수 있게 합니다. 

3. Meta-Object Compiler (moc)는 QObject의 Subclass로 하여 Meta-Object 기능 구현에 필요한 코드를 제공합니다.

 

moc 툴은 C++ 헤더 혹은 소스파일로 부터 Q_OBJECT 매크로가 선언된 클래스를 찾고,

각 클래스에 대해 Meta-Object 코드를 포함하는 또다른 C++ 소스를 생성합니다.

 

이렇게 생성된 코드는 클래스의 소스파일에서 include 하는데, 대게 클래스 구현과 함께 컴파일 및 링크가 되고,

만약 qmake를 사용하여 makefile을 작성하는 경우 moc를 호출하는 빌드 규칙이 포함됩니다.

 

또한, QObject를 상속받은 Class의 객체는 Parent 객체가 소멸할 때 자동 소멸합니다.

위 내용에 대해 예를 하나 들어보자면, 다음과 같습니다.

ex) 1. QPushButton *btn = new QPushButton();

      2. QPushButton *btn = new QPushButton(this);

 

1번의 경우 객체를 생성할 때 Parent를 지정하지 않았으므로 자동소멸이 되지 않는 경우입니다.

2번의 경우 객체를 생성할 때 Parent를 지정하였고 btn 객체의 부모가 소멸될 때 자동으로 소멸됩니다.

 

객체를 생성할 때 2번과 같이 Parent 객체에 추가한다면 자동으로 Parent가 지정되고, setParent() 함수를 통해 임의로 지정해 줄 수 있습니다.

이처럼 Qt에서 객체 생성 시 Parent와의 관계를 알고 프로그램을 구현한다면 메모리에 대한 고민을 덜 수 있습니다.

객체들 간에 Signal / Slot 통신 메커니즘 및 자동 소멸 등을 제공하는 것이 Meta-Object System의 핵심입니다.