QML 값 유형 및 시퀀스 참조
QML 값 유형과 QML 시퀀스 유형은 반드시 값으로 전달됩니다. QML 객체 유형과 달리 이 유형들은 자체적인 정체성을 갖지 않으며, 다른 객체나 값의 속성으로, 또는 메서드에서 반환되는 값으로만 접근할 수 있습니다. 이러한 접근은 매번 암묵적으로 복사본을 생성합니다. 그러나 자바스크립트에서는 모든 것이 객체입니다. 자바스크립트에는 값 유형이라는 개념이 없습니다. 예를 들어, 자바스크립트에서 ` font.bold = true `를 실행하면, ` font `의 값이 무엇이든 상관없이 ` font `의 ` bold ` 속성이 설정될 것으로 예상합니다. 하지만 다음 코드 조각을 살펴보십시오.
import QtQuick
Text {
onSomethingHappened: font.bold = true
}이 경우 font 가 값형이라는 것을 알 수 있습니다. 이에 접근하면 Q_PROPERTY 의 게터 메서드를 호출하여 로컬 복사본이 생성됩니다. 그런 다음 이 복사본의 bold 속성을 설정할 수는 있지만, 일반적으로 이는 복사본에만 영향을 미치고 원래의 Q_PROPERTY 에는 영향을 미치지 않습니다.
이 문제를 해결하기 위해 QML은 참조(reference) 개념을 제공합니다. 속성에서 값이나 시퀀스 유형의 인스턴스를 가져올 때, QML 엔진은 값 자체와 함께 해당 속성도 기억합니다. 값이 수정되면, 수정된 내용이 속성에 다시 기록됩니다. 이를 통해 별도의 정체성을 가진 객체와 같은 착각을 일으키며, 위에서 언급한 경우를 비롯한 여러 상황에서 문제가 없이 작동하게 합니다.
하지만 이 과정은 상당히 많은 비용이 들 수 있습니다. 시퀀스가 ` Q_PROPERTY`로 노출된 경우, 인덱스를 통해 시퀀스의 어떤 값에 접근하더라도 속성에서 시퀀스 데이터 전체가 읽혀집니다. 그런 다음 이 시퀀스 데이터에서 단일 요소가 추출됩니다. 마찬가지로, 시퀀스의 어떤 값을 수정하더라도 시퀀스 데이터가 읽혀집니다. 그런 다음 수정 작업이 수행되고, 수정된 시퀀스가 속성에 다시 기록됩니다. 해당 유형이 암시적으로 공유되는 경우 읽기 작업은 상대적으로 비용이 적게 듭니다. 반면 수정 작업은 항상 적어도 한 번의 심층 복사를 수반합니다.
Q_INVOKABLE 함수에서 시퀀스나 값 타입의 인스턴스를 반환하면 이러한 오버헤드를 피할 수 있습니다. 반환 값은 어떤 속성에도 연결되지 않으므로 다시 쓰여지지 않습니다.
객체 유형의 시퀀스는 기본적으로 ` QQmlListProperty `으로 전달됩니다. ` QQmlListProperty `은 실제 컨테이너가 아니라, 일정한 순차적 저장 공간에 대한 뷰 또는 참조일 뿐입니다. 따라서 ` QQmlListProperty `은 이 효과의 영향을 받지 않습니다. 하지만 ` QML_SEQUENTIAL_CONTAINER`을 사용하여 객체에 대한 다른 시퀀스 유형을 등록할 수 있습니다. 이 경우 해당 유형들은 이 효과의 영향을 받게 됩니다.
© 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.