Object Model/ko
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine. Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean. |
Object Model
표준 C++ 객체 모델은 객체 패러다임에 매우 효율적인 런타임 지원을 제공합니다. 하지만, 그 고정적인 특성으로 인해 특정 문제 분야에서는 유연성이 떨어집니다.
GUI 프로그래밍 분야는 런타임 효율성과 고수준의 유연성을 동시에 요구하는 분야입니다. Qt는 C+의 속도와 Qt 객체 모델의 유연함을 결합하여 이를 제공해 줍니다.
Qt는 C에 다음 기능을 추가합니다:
- signal and slot이라고 하는 매끄러운 객체 통신을 위한 매우 강력한 메커니즘.
- 쿼리와 디자인이 가능한 객체 속성(object property)
- 강력한 이벤트와 이벤트 필터(events and event filters)
- 국제화를 위한 문맥 기반 문자열 번역
- 하나의 이벤트 기반 GUI에 많은 작업을 우아하게 통합할 수 있게 하는, 세련된 간격 기반 타이머(timers)
- 자연스럽게 객체의 소유권을 조직하는 계층형 질의가능 객체 트리(object trees).
- 참조하는 객체가 소멸되면 dangling pointer가 되는 일반 C+ 포인터와 달리, 해당 객체가 소멸되면 자동으로 0이 되는, 보호 포인터 (QPointer).
- 라이브러리 경계를 넘어서 동작하는 동적 캐스팅(dynamic cast).
- 사용자 정의 타입(custom type) 생성에 대한 지원.
이 Qt 기능 중 많은 것이 QObject 상속을 기반으로 한, 표준 C++ 기술로 구현되었습니다. 객체 통신 메커니즘과 동적 속성 시스템 등등은, Qt가 소유한 Meta-Object Compiler (moc) 의해 제공되는 Meta-Object System 필요로 합니다.
Meta-object system은, C++ 언어를 진정한 컴포넌트 GUI 프로그램에 더 잘 맞도록 해주는, 언어 확장입니다.
중요 클래스들
이 클래스들은 Qt 개체 모델의 근간을 이룹니다.
{background:#ddd}. | QMetaObject | Qt object에 대한 메타 정보를 포함 | | QMetaMethod | 멤버 함수에 대한 메타 데이터 | {background:#ddd}. | QMetaEnum | enumerator 에 대한 메타 데이터 | | QMetaProperty | property에 대한 메타 데이터 | {background:#ddd}. | QMetaClassInfo | class 클래스에 대한 추가 정보 | | QMetaType | meta-object system의 명명된 타입을 관리 | {background:#ddd}. | QObject | 모든 Qt 객체의 기반 클래스 | | QObjectCleanupHandler | 다수의 QObject의 생명주기를 감시 | {background:#ddd}. | QPointer | QObject에 대한 보호 포인터를 제공하는 템플릿 클래스 | | QSignalMapper | 인식 가능한 송신자로부터의 신호 묶음 | {background:#ddd}. | QVariant | 가장 대표적인 Qt 데이터 타입들에 대한 union처럼 동작 |
Qt 객체: ID (Identity)냐 값이냐
Qt 객체 모델에 대해서 위에 나열된 추가 기능 중 몇 가지는, Qt 객체를 값이 아닌 ID로 생각하기를 요구합니다.
값은 복사되거나 할당되고, ID는 복제됩니다. 복제라 함은, 이전과 완벽히 동일한 복사본이 아니라 새 ID를 생성한다는 것을 의미합니다. 예를 들어, 쌍둥이는 서로 다른 ID를 갖습니다. 그들은 똑같아 보이지만, 서로 다른 이름을 갖고 있고, 서로 다른 곳에 살며, 완전히 다른 인맥을 갖습니다.
때문에, ID를 복제하는 것은 복사나 값 할당 보다 더 복잡한 작업입니다. 우리는 이 것의 의미를 Qt 객체 모델에서 볼 수 있습니다.
하나의 Qt 객체는…
- 고유의 QObject::objectName() 을 가질 수 있습니다.
만약 우리가 Qt 객체를 복사한다면, 이 사본의 이름을 뭐라고 지어야 할까요?
- 객체 계층구조(object hierarchy) 의 한 장소에 자리잡고 있습니다.
만약 우리가 Qt 객체를 복사한다면, 이 사본은 어디에 위치시켜야 할까요?
- 다른 Qt 객체에 신호를 발신하거나 수신하기 위해 연결될 수 있습니다.
만약 우리가 Qt 객체를 복사한다면, 이 연결들을 어떻게 복사본으로 이전해야 할까요?
- C++ 클래스로 선언되지 않았다면, 런타임에 new properties 추가할 수 있습니다.
만약 우리가 Qt 객체를 복사한다면, 이 복사본도 원본에 추가된 속성을 포함해야 할까요?
이러한 이유로, Qt 객체는 값이 아닌 ID로 취급되어야 합니다. ID는 복사나 할당이 아니라 복제되며, ID의 복제는 복사나 값의 할당보다 더 복잡한 작업입니다. 때문에, QObject 모든 QObject의 직간접적 서브 클래스들의 복사생성자 및 할당연산자(copy constructor and assignment operator 비활성 상태로 되어 있습니다.