객체 트리 및 소유권
개요
QObjects 객체 트리 형태로 스스로를 구성합니다. 다른 객체를 부모로 하여 객체 인스턴스( QObject )를 생성하면, 해당 인스턴스는 부모의 ` children()` 목록에 추가되며, 부모가 삭제될 때 함께 삭제됩니다. 이 방식은 GUI 객체의 요구 사항에 매우 잘 부합하는 것으로 나타났습니다. 예를 들어, 키보드 단축키( QShortcut )는 해당 창의 자식 객체이므로, 사용자가 해당 창을 닫으면 단축키도 함께 삭제됩니다.
QQuickItem Qt Quick 모듈의 기본 시각 요소인 아이템(item)은 을 상속받지만, QObject시각 부모에 대한 개념은 QObject 부모의 개념과는 다릅니다. 아이템의 시각 부모는 반드시 객체 부모와 동일할 필요는 없습니다. 자세한 내용은 Qt Quick 의 ‘개념 - 시각 부모(Concepts - Visual Parent)’를 참조하십시오.
QWidget, Qt Widgets 모듈의 기본 클래스인 이 클래스는 부모-자식 관계를 확장합니다. 자식 위젯은 일반적으로 자식 위젯이 되며, 즉 부모의 좌표계에 표시되고 부모의 경계에 의해 그래픽적으로 잘립니다. 예를 들어, 애플리케이션이 메시지 상자가 닫힌 후 이를 삭제하면, 버튼과 레이블이 메시지 상자의 자식 요소이므로 우리가 원하는 대로 버튼과 레이블도 함께 삭제됩니다.
사용자가 직접 자식 객체를 삭제할 수도 있으며, 이 경우 해당 객체들은 부모로부터 스스로 제거됩니다. 예를 들어, 사용자가 툴바를 제거하면 애플리케이션이 해당 툴바의 ` QToolBar ` 객체 중 하나를 삭제하게 될 수 있습니다. 이 경우 툴바의 ` QMainWindow ` 부모는 이러한 변경 사항을 감지하고 그에 따라 화면 공간을 재구성합니다.
응용 프로그램의 외관이나 동작이 이상할 때, 디버깅 함수인 QObject::dumpObjectTree() 및 QObject::dumpObjectInfo()이 종종 유용합니다.
QObject의 생성/소멸 순서
QObjects 가 힙에 생성될 때(즉, new 연산자로 생성될 때), 이 객체들을 임의의 순서로 트리 구조를 구성할 수 있으며, 나중에 트리 내의 객체들을 임의의 순서로 소멸시킬 수 있습니다. 트리 내의 어떤 QObject 이 삭제될 때, 해당 객체에 부모가 있다면 소멸자는 자동으로 해당 객체를 부모에서 제거합니다. 객체에 자식이 있다면, 소멸자는 각 자식을 자동으로 삭제합니다. 소멸 순서와 관계없이 어떤 QObject 도 두 번 삭제되지 않습니다.
QObjects 가 스택에서 생성될 때도 동일한 동작이 적용됩니다. 일반적으로 소멸 순서는 여전히 문제가 되지 않습니다. 다음 코드 조각을 살펴보겠습니다:
int main()
{
QWidget window;
QPushButton quit("Quit", &window);
//...
}부모인 window 와 자식인 quit 는 모두 QObjects 입니다. 왜냐하면 QPushButton 는 QWidget 를 상속받고, QWidget 는 QObject 를 상속받기 때문입니다. 이 코드는 올바릅니다. C++ 언어 표준 (ISO/IEC 14882:2003) 에 따르면 지역 객체의 소멸자는 생성자의 역순으로 호출되도록 규정되어 있으므로, quit 의 소멸자가 두 번 호출되지는 않습니다. 따라서 자식 객체인 quit 의 소멸자가 먼저 호출되며, 이 소멸자는 window 의 소멸자가 호출되기 전에 부모 객체인 window 에서 자신을 제거합니다.
하지만 이제 두 번째 코드 조각에서 볼 수 있듯이, 생성 순서를 바꾼다면 어떤 일이 일어나는지 생각해 봅시다:
int main()
{
QPushButton quit("Quit");
QWidget window;
quit.setParent(&window);
//...
}이 경우, 소멸 순서 때문에 문제가 발생합니다. 부모 객체는 마지막으로 생성되었기 때문에 부모 객체의 소멸자가 먼저 호출됩니다. 그런 다음 부모 객체는 자식 객체인 quit 의 소멸자를 호출하는데, 이는 quit 가 지역 변수이므로 잘못된 동작입니다. 이후 quit 가 범위 밖으로 나가면 그 소멸자가 다시 호출되는데, 이번에는 올바르게 호출되지만 이미 문제는 발생한 후입니다.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.