QML 값 유형 및 시퀀스 참조
QML 값 유형과 QML 시퀀스 유형은 반드시 값으로 전달됩니다. QML 객체 유형과는 달리, 이들은 자체의 정체성이 없으며 다른 객체나 값의 속성 또는 메서드에서 반환된 값으로만 액세스할 수 있습니다. 이러한 각 액세스는 암시적으로 복사본을 생성합니다. 하지만 자바스크립트에서는 모든 것이 객체입니다. 자바스크립트에는 값 유형과 같은 개념이 없습니다. 예를 들어, 자바스크립트에서 font.bold = true
을 실행하면 font
이 무엇이든 font
의 bold
속성이 설정될 것으로 예상합니다. 하지만 다음 코드 스니펫을 생각해 보세요:
import QtQuick Text { onSomethingHappened: font.bold = true }
이 경우 font
이 값 유형이라는 것을 알고 있습니다. 이 값에 액세스하면 Q_PROPERTY 의 getter를 호출하여 로컬 복사본이 생성됩니다. 그러면 bold
속성을 설정할 수 있지만 일반적으로 원본 Q_PROPERTY 이 아닌 복사본에만 영향을 미칩니다.
이 문제를 극복하기 위해 QML은 참조라는 개념을 제공합니다. 프로퍼티에서 값 또는 시퀀스 유형의 인스턴스를 검색할 때 QML 엔진은 값 자체와 함께 프로퍼티를 기억합니다. 값이 수정되면 프로퍼티에 다시 기록됩니다. 이렇게 하면 별도의 정체성을 가진 객체가 있는 것처럼 보이게 되고 위의 사례와 다른 많은 사례에서도 작동합니다.
하지만 이는 다소 비용이 많이 들 수 있습니다. 시퀀스가 Q_PROPERTY 로 노출된 경우 인덱스로 시퀀스의 모든 값에 액세스하면 속성에서 전체 시퀀스 데이터를 읽게 됩니다. 그러면 이 시퀀스 데이터에서 단일 요소가 검색됩니다. 마찬가지로 시퀀스의 값을 수정하면 시퀀스 데이터가 읽혀집니다. 그런 다음 수정이 수행되고 수정된 시퀀스가 프로퍼티에 다시 기록됩니다. 해당 유형이 암시적으로 공유되는 경우 읽기 작업은 상대적으로 저렴할 수 있습니다. 수정은 항상 적어도 하나의 심층 복사본을 발생시킵니다.
Q_INVOKABLE 함수에서 시퀀스 또는 값 유형의 인스턴스를 반환하면 이러한 오버헤드를 피할 수 있습니다. 반환 값은 프로퍼티에 첨부되지 않으며 다시 기록되지 않습니다.
객체 유형의 시퀀스는 기본적으로 QQmlListProperty 으로 전달됩니다. QQmlListProperty 은 실제 컨테이너가 아니라 일부 시퀀스 스토리지에 대한 보기 또는 참조일 뿐입니다. 따라서 QQmlListProperty 은 이 효과의 영향을 받지 않습니다. 그러나 QML_SEQUENTIAL_CONTAINER 을 사용하여 객체에 대한 다른 시퀀스 유형을 등록할 수 있습니다. 이러한 경우 영향을 받습니다.
© 2025 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.