이 페이지에서

암시적 공유

Qt의 많은 C++ 클래스는 리소스 사용을 극대화하고 복사를 최소화하기 위해 암시적 데이터 공유를 사용합니다. 암시적으로 공유되는 클래스는 인자로 전달될 때 안전하면서도 효율적입니다. 이는 데이터에 대한 포인터만 전달되며, 함수가 데이터에 쓰기를 수행할 때만 데이터가 복사되기 때문입니다. 즉, '쓰기 시 복사(copy-on-write)' 방식입니다.

개요

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

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

공유 객체를 다룰 때 객체를 복사하는 방법에는 두 가지가 있습니다. 일반적으로 ‘심층 복사’와 ‘표면 복사’라고 부릅니다. 심층 복사는 객체를 복제하는 것을 의미합니다. 얕은 복사는 참조 복사, 즉 공유 데이터 블록에 대한 포인터만 복사하는 것을 의미합니다. 깊은 복사를 수행하는 것은 메모리와 CPU 측면에서 많은 자원을 소모할 수 있습니다. 반면 얕은 복사는 포인터를 설정하고 참조 횟수를 증가시키는 작업만 포함하기 때문에 매우 빠릅니다.

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

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

암시적 공유는 대부분 백그라운드에서 이루어지므로, 프로그래머가 이에 대해 신경 쓸 일은 거의 없습니다. 그러나 Qt의 컨테이너 반복자는 STL의 반복자와는 다른 동작을 보입니다. ‘암시적 공유 반복자 문제’를 참조하십시오.

다중 스레드 애플리케이션에서는 ‘스레드 및 암시적 공유 클래스’에서 설명한 바와 같이 암시적 공유가 발생합니다.

사용자 정의 암시적 공유 클래스를 구현할 때는 ` QSharedData ` 및 ` QSharedDataPointer ` 클래스를 사용하십시오.

암시적 공유에 대한 상세 설명

암시적 공유는 객체가 변경될 예정이고 참조 횟수가 1보다 클 경우, 해당 객체를 공유 블록에서 자동으로 분리합니다. (이를 흔히 ‘쓰기 시 복사(copy-on-write) ’ 또는 ‘값 의미론(value semantics)’이라고 합니다.)

암시적 공유 클래스는 내부 데이터를 제어합니다. 데이터를 수정하는 모든 멤버 함수에서, 데이터를 수정하기 전에 자동으로 분리됩니다. 단, 컨테이너 이터레이터와 관련된 특수한 경우를 유의하십시오. ‘암시적 공유 이터레이터 문제’를 참조하십시오.

암시적 공유를 사용하는 ` QPen ` 클래스는 내부 데이터를 변경하는 모든 멤버 함수에서 공유 데이터와의 연결을 해제합니다.

코드 예시:

void QPen::setCapStyle(Qt::PenCapStyle c)
{
    if (d->capStyle == c)
        return;
    detach();
    d->capStyle = c;
}

void QPen::detach()
{
    d.detach();
}

클래스 목록

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

예시:

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();

이 예제에서 p1 와 p2 는 p2 에 대해 QPainter::begin()가 호출될 때까지 데이터를 공유합니다. 픽스맵을 그리는 작업은 픽스맵을 수정하기 때문입니다.

경고: 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

글꼴 메트릭 정보

QFontVariableAxis

글꼴 내의 가변 축을 나타냄

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

블루투스 저에너지(BLE) 광고 중에 전송될 데이터를 나타냅니다

QLowEnergyAdvertisingParameters

블루투스 저에너지(BLE) 광고에 사용되는 매개변수를 나타냅니다

QLowEnergyCharacteristicData

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

QLowEnergyConnectionParameters

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

QLowEnergyDescriptorData

GATT 서비스 데이터를 생성하는 데 사용됩니다

QLowEnergyServiceData

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

QMap

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

QMimeType

MIME 유형 문자열로 표현되는 파일 또는 데이터의 유형을 설명합니다

QMqttTopicFilter

MQTT 토픽 필터를 나타냅니다

QMqttTopicName

MQTT 토픽 이름을 나타냅니다

QMultiHash

다중 값 해시 테이블

QMultiMap

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

QNetworkAddressEntry

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

QNetworkCacheMetaData

캐시 정보

QNetworkCookie

네트워크 쿠키 하나를 보관합니다

QNetworkInterface

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

QNetworkProxy

네트워크 계층 프록시

QNetworkProxyQuery

소켓에 대한 프록시 설정을 조회하는 데 사용됩니다

QNetworkRequest

QNetworkAccessManager를 통해 전송될 요청을 보관합니다

QNetworkRequestFactory

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

QOpenGLDebugMessage

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

QPageRanges

페이지 범위 모음을 나타냅니다

QPalette

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

QPen

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

QPersistentModelIndex

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

QPicture

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

QPixmap

페인트 장치로 사용할 수 있는 오프스크린 이미지 표현

QPolygon

정수 정밀도를 사용하는 점의 목록

QPolygonF

부동 소수점 정밀도를 사용하는 점의 목록

QProcessEnvironment

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

QQueue

큐를 제공하는 범용 컨테이너

QRawFont

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

QRegExp

정규식을 사용한 패턴 매칭

QRegion

페인터에 대한 클립 영역을 지정합니다

QRegularExpression

정규 표현식을 사용한 패턴 매칭

QRegularExpressionMatch

QRegularExpression을 문자열에 대입하여 일치시킨 결과

QRegularExpressionMatchIterator

QRegularExpression 객체가 문자열에 대해 전역 일치를 수행한 결과에 대한 이터레이터

QSet

해시 테이블 기반의 세트를 제공하는 템플릿 클래스

QShader

여러 셰이딩 언어로 변환된 셰이더의 여러 버전과 리플렉션 메타데이터를 포함합니다

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 데이터 유형에 대한 연합(union)과 같은 역할을 수행합니다

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