암묵적 공유

Qt의 많은 C++ 클래스는 암시적 데이터 공유를 사용하여 리소스 사용을 극대화하고 복사를 최소화합니다. 암시적으로 공유되는 클래스는 데이터에 대한 포인터만 전달되고 함수가 데이터를 쓸 때만 데이터가 복사되기 때문에(즉, 쓰기 시 복사) 인자로 전달될 때 안전하고 효율적입니다.

개요

공유 클래스는 참조 횟수와 데이터를 포함하는 공유 데이터 블록에 대한 포인터로 구성됩니다.

공유 객체가 생성되면 참조 카운트가 1로 설정됩니다. 새 객체가 공유 데이터를 참조할 때마다 참조 카운트가 증가하고, 객체가 공유 데이터를 참조 해제하면 참조 카운트가 감소합니다. 참조 카운트가 0이 되면 공유 데이터는 삭제됩니다.

공유 객체를 다룰 때 객체를 복사하는 방법에는 두 가지가 있습니다. 일반적으로 카피와 카피에 대해 이야기합니다. 딥 카피는 객체를 복제하는 것을 의미합니다. 얕은 복사본은 참조 복사본, 즉 공유 데이터 블록에 대한 포인터일 뿐입니다. 딥 카피는 메모리와 CPU 측면에서 비용이 많이 들 수 있습니다. 얕은 복사본은 포인터를 설정하고 참조 횟수를 늘리기만 하면 되기 때문에 매우 빠릅니다.

암시적으로 공유되는 객체에 대한 객체 할당(연산자=() 사용)은 얕은 복사본을 사용하여 구현됩니다.

공유의 장점은 프로그램이 불필요하게 데이터를 복제할 필요가 없으므로 메모리 사용량과 데이터 복사가 줄어든다는 것입니다. 객체를 쉽게 할당하고, 함수 인수로 전송하고, 함수에서 반환할 수 있습니다.

암시적 공유는 대부분 백그라운드에서 이루어지므로 프로그래머는 이에 대해 걱정할 필요가 거의 없습니다. 그러나 Qt의 컨테이너 이터레이터는 STL의 그것과는 다른 동작을 합니다. 암시적 공유 이터레이터 문제를 읽어보세요.

멀티스레드 애플리케이션에서는 스레드와 암시적으로 공유되는 클래스에서 설명한 대로 암시적 공유가 발생합니다.

암시적으로 공유되는 자체 클래스를 구현할 때는 QSharedDataQSharedDataPointer 클래스를 사용하세요.

암시적 공유 자세히 보기

암시적 공유는 객체가 변경될 예정이고 참조 횟수가 1보다 큰 경우 공유 블록에서 객체를 자동으로 분리합니다. (이를 종종 복사 시 쓰기 또는 값 의미론이라고 합니다.)

암시적으로 공유된 클래스는 내부 데이터에 대한 제어권을 갖습니다. 데이터를 수정하는 모든 멤버 함수에서 데이터를 수정하기 전에 자동으로 분리됩니다. 그러나 컨테이너 이터레이터의 특수한 경우에 유의하세요( 암시적 공유 이터레이터 문제 참조).

암시적 공유를 사용하는 QPen 클래스는 내부 데이터를 변경하는 모든 멤버 함수의 공유 데이터에서 분리됩니다.

코드 조각:

void QPen::setStyle(Qt::PenStyle style)
{
    detach();           // detach from common data
    d->style = style;   // set the style member
}

void QPen::detach()
{
    if (d->ref != 1) {
        ...             // perform a deep copy
    }
}

클래스 목록

아래 나열된 클래스는 객체가 변경될 경우 공통 데이터에서 자동으로 분리됩니다. 프로그래머는 객체가 공유된다는 사실조차 알아차리지 못합니다. 따라서 이러한 클래스의 개별 인스턴스는 별도의 객체로 취급해야 합니다. 항상 별도의 객체로 동작하지만 가능한 경우 데이터를 공유할 수 있는 추가적인 이점이 있습니다. 따라서 복사 오버헤드에 대한 걱정 없이 이러한 클래스의 인스턴스를 값별로 함수의 인수로 전달할 수 있습니다.

예시:

QPixmap p1, p2;
p1.load("image.bmp");
p2 = p1;                        // p1 and p2 share data

QPainter paint;
paint.begin(&p2);               // cuts p2 loose from p1
paint.drawText(0,50, "Hi");
paint.end();

이 예제에서 p1p2QPainter::begin()가 p2 에 대해 호출될 때까지 데이터를 공유하는데, 이는 픽셀맵을 그리면 수정되기 때문입니다.

경고: STL 스타일 반복기를 사용하는 동안 암시적으로 공유되는 컨테이너(QMap, QList, 등)를 복사할 때는 주의하세요. 암시적 공유 반복기 문제를 참조하세요.

QBitArray

비트 배열

QBitmap

흑백(1비트 깊이) 픽셀맵

QBrush

QPainter에서 그리는 도형의 채우기 패턴을 정의합니다.

QByteArray

바이트 배열

QByteArrayList

바이트 배열 목록

QByteArrayView

QByteArray API의 읽기 전용 하위 집합으로 바이트 배열을 봅니다.

QCache

캐시를 제공하는 템플릿 클래스

QCollator

지역화된 콜레이션 알고리즘에 따라 문자열을 비교합니다.

QCollatorSortKey

문자열 데이터 정렬 속도를 높이는 데 사용 가능

QCommandLineOption

가능한 명령줄 옵션을 정의합니다.

QContiguousCache

연속 캐시를 제공하는 템플릿 클래스

QCursor

임의의 모양을 가진 마우스 커서

QDBusPendingCall

하나의 보류 중인 비동기 호출을 참조합니다.

QDBusUnixFileDescriptor

하나의 유닉스 파일 기술자 보유

QDateTime

날짜 및 시간 함수

QDebug

디버깅 정보를 위한 출력 스트림

QDir

디렉토리 구조 및 그 내용에 대한 액세스

QDnsDomainNameRecord

도메인 네임 레코드에 대한 정보를 저장합니다.

QDnsHostAddressRecord

호스트 주소 레코드에 대한 정보를 저장합니다.

QDnsMailExchangeRecord

DNS MX 레코드에 대한 정보 저장

QDnsServiceRecord

DNS SRV 레코드에 대한 정보를 저장합니다.

QDnsTextRecord

DNS TXT 레코드에 대한 정보를 저장합니다.

QDnsTlsAssociationRecord

DNS TLSA 레코드에 대한 정보를 저장합니다.

QFileInfo

파일 시스템 항목에 대한 정보를 검색하는 OS 독립적 API

QFont

텍스트 그리기에 사용되는 글꼴에 대한 쿼리를 지정합니다.

QFontInfo

글꼴에 대한 일반 정보

QFontMetrics

글꼴 메트릭 정보

QFontMetricsF

글꼴 메트릭 정보

QFormDataBuilder

QHttpMultiPart 객체 구성을 간소화하는 편의 클래스

QFormDataPartBuilder

QHttpPart 객체의 구성을 단순화하기 위한 편의 클래스

QGeoAreaMonitorInfo

근접성을 모니터링할 지역 또는 영역의 매개변수를 설명합니다.

QGeoPositionInfo

특정 시점의 전지구적 위치, 방향 및 속도에 대해 수집된 정보를 포함합니다.

QGeoSatelliteInfo

위성에 대한 기본 정보 포함

QGlyphRun

글꼴의 내부 글리프에 직접 액세스 가능

QGradient

QBrush와 함께 사용하여 그라데이션 채우기를 지정합니다.

QHash

해시 테이블 기반 사전을 제공하는 템플릿 클래스

QHostAddress

IP 주소

QHttp1Configuration

HTTP/1 매개변수 및 설정 제어

QHttp2Configuration

HTTP/2 매개변수 및 설정을 제어합니다.

QHttpPart

HTTP 멀티파트 MIME 메시지 내에서 사용할 본문 부분 보유

QIcon

다양한 모드와 상태의 확장 가능한 아이콘

QImage

픽셀 데이터에 직접 액세스할 수 있고 페인트 장치로 사용할 수 있는 하드웨어 독립적 이미지 표현

QJsonArray

JSON 배열 캡슐화

QJsonDocument

JSON 문서를 읽고 쓰는 방법

QJsonObject

JSON 객체를 캡슐화합니다.

QJsonParseError

JSON 구문 분석 중 오류를 보고하는 데 사용

QJsonValue

JSON의 값을 캡슐화합니다.

QKeySequence

단축키에 사용되는 키 시퀀스를 캡슐화합니다.

QLinkedList

링크된 목록을 제공하는 템플릿 클래스

QList

동적 배열을 제공하는 템플릿 클래스

QLocale

다양한 언어로 숫자와 그 문자열 표현을 변환합니다.

QLowEnergyAdvertisingData

블루투스 저에너지 광고 중에 브로드캐스트할 데이터를 나타냅니다.

QLowEnergyAdvertisingParameters

블루투스 저에너지 광고에 사용되는 파라미터를 나타냅니다.

QLowEnergyCharacteristicData

GATT 서비스 데이터를 설정하는 데 사용

QLowEnergyConnectionParameters

Bluetooth LE 연결의 매개변수 업데이트를 요청하거나 보고할 때 사용됩니다.

QLowEnergyDescriptorData

GATT 서비스 데이터 생성에 사용

QLowEnergyServiceData

GATT 서비스 데이터를 설정하는 데 사용됩니다.

QMap

연관 배열을 제공하는 템플릿 클래스

QMimeType

파일 또는 데이터의 유형을 설명하며, MIME 유형 문자열로 표현됩니다.

QMqttTopicFilter

MQTT 토픽 필터를 나타냅니다.

QMqttTopicName

MQTT 토픽 이름을 나타냅니다.

QMultiHash

다중 값 해시를 제공하는 편리한 QHash 서브 클래스

QMultiMap

여러 개의 동등한 키가 있는 연관 배열을 제공하는 템플릿 클래스

QNetworkAddressEntry

네트워크 인터페이스에서 지원하는 하나의 IP 주소와 관련 넷마스크 및 브로드캐스트 주소를 저장합니다.

QNetworkCacheMetaData

캐시 정보

QNetworkCookie

네트워크 쿠키 1개 보유

QNetworkInterface

호스트의 IP 주소 및 네트워크 인터페이스 목록

QNetworkProxy

네트워크 계층 프록시

QNetworkProxyQuery

소켓의 프록시 설정을 쿼리하는 데 사용됩니다.

QNetworkRequest

QNetworkAccessManager로 전송할 요청을 보유합니다.

QNetworkRequestFactory

공통 네트워크 요청 속성을 공유하는 원격 서버 엔드포인트를 그룹화하기 위한 편의 클래스

QOpenGLDebugMessage

OpenGL 디버그 메시지를 래핑합니다.

QPageRanges

페이지 범위의 컬렉션을 나타냅니다.

QPainterPath

그래픽 모양을 구성하고 재사용할 수 있는 페인팅 작업용 컨테이너

QPalette

각 위젯 상태에 대한 색상 그룹을 포함합니다.

QPen

QPainter가 도형의 선과 윤곽선을 그리는 방법을 정의합니다.

QPersistentModelIndex

데이터 모델에서 데이터를 찾는 데 사용

QPicture

QPainter 명령을 기록하고 재생하는 페인트 장치

QPixmap

페인트 장치로 사용할 수 있는 화면 밖 이미지 표현

QPolygon

정수 정밀도를 사용하는 포인트 목록

QPolygonF

부동 소수점 정밀도를 사용하는 포인트 목록

QProcessEnvironment

프로그램에 전달할 수 있는 환경 변수를 보유합니다.

QQueue

큐를 제공하는 일반 컨테이너

QRawFont

글꼴의 단일 물리적 인스턴스에 대한 액세스

QRegExp

정규 표현식을 사용한 패턴 일치

QRegion

페인터의 클립 영역 지정

QRegularExpression

정규 표현식을 사용한 패턴 일치

QRegularExpressionMatch

문자열에 대한 QRegularExpression 일치 결과

QRegularExpressionMatchIterator

문자열에 대한 QRegularExpression 객체의 전역 일치 결과에 대한 이터레이터

QSet

해시 테이블 기반 집합을 제공하는 템플릿 클래스

QSqlField

SQL 데이터베이스 테이블 및 뷰의 필드를 조작합니다.

QSqlQuery

SQL 문을 실행하고 조작하는 수단

QSqlRecord

데이터베이스 레코드 캡슐화

QSslCertificate

X509 인증서를 위한 편리한 API

QSslCertificateExtension

X509 인증서의 확장에 액세스하기 위한 API

QSslCipher

SSL 암호화 암호를 나타냅니다.

QSslConfiguration

SSL 연결의 구성 및 상태 보유

QSslDiffieHellmanParameters

서버용 Diffie-Hellman 매개변수용 인터페이스

QSslError

SSL 오류

QSslKey

비공개 및 공개 키용 인터페이스

QSslPreSharedKeyAuthenticator

PSK(사전 공유 키) 암호 집합에 대한 인증 데이터

QStack

스택을 제공하는 템플릿 클래스

QStaticText

텍스트 및 레이아웃이 드물게 업데이트될 때 최적화된 텍스트 그리기 가능

QStorageInfo

현재 마운트된 스토리지 및 드라이브에 대한 정보 제공

QString

유니코드 문자 문자열

QStringList

문자열 목록

QTextBlockFormat

QTextDocument의 텍스트 블록에 대한 서식 정보

QTextBoundaryFinder

문자열에서 유니코드 텍스트 경계를 찾는 방법

QTextCharFormat

QTextDocument의 문자에 대한 서식 정보

QTextCursor

QTextDocument에 액세스하고 수정하는 API 제공

QTextDocumentFragment

QTextDocument에서 포맷된 텍스트 조각을 나타냅니다.

QTextFormat

QTextDocument의 서식 정보

QTextFrameFormat

QTextDocument의 프레임에 대한 서식 정보

QTextImageFormat

QTextDocument의 이미지에 대한 서식 정보

QTextListFormat

QTextDocument의 목록 서식 지정 정보

QTextTableCellFormat

QTextDocument의 표 셀 서식 지정 정보

QTextTableFormat

QTextDocument의 표 서식 지정 정보

QUrl

URL 작업을 위한 편리한 인터페이스

QUrlQuery

URL 쿼리에서 키-값 쌍을 조작하는 방법

QVariant

가장 일반적인 Qt 데이터 유형에 대한 유니온처럼 작동하는 방법

© 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.