문자열 데이터용 클래스

개요

이 페이지에서는 Qt의 문자열 클래스, 특히 많은 양의 문자열 컨테이너와 이를 성능에 중요한 코드에서 효율적으로 사용하는 방법에 대한 개요를 제공합니다.

효율적인 사용을 위한 다음 지침은 상당한 양의 문자열 처리를 포함하는 성능에 중요한 코드를 작업하는 숙련된 개발자를 대상으로 합니다. 예를 들어 파서나 텍스트 파일 생성기가 여기에 해당합니다. 일반적으로 QString 은 어디에서나 사용할 수 있으며 정상적으로 작동합니다. 또한 여러 인코딩을 처리하기 위한 API도 제공합니다(예: QString::fromLatin1()). 많은 애플리케이션, 특히 문자열 처리가 성능에 중요한 역할을 하지 않는 경우에는 QString 이 간단하고 충분한 솔루션이 될 것입니다. 일부 Qt 함수는 QStringView 를 반환합니다. 필요한 경우 QStringView::toString()를 사용하여 QString 로 변환할 수 있습니다.

영향력 있는 팁

다음 세 가지 규칙은 복잡성을 크게 증가시키지 않으면서 문자열 처리를 크게 개선합니다. 대부분의 경우 이 규칙을 따르면 거의 최적의 성능을 얻을 수 있습니다. 처음 두 규칙은 문자열 리터럴의 인코딩과 소스 코드에 표시하는 방법을 다룹니다. 세 번째 규칙은 문자열의 일부를 사용할 때 딥 카피를 처리합니다.

  • ASCII 문자만 포함된 모든 문자열(예: 로그 메시지)은 Latin-1로 인코딩할 수 있습니다. string literal "foo"_L1 을 사용합니다. 이 접미사가 없으면 소스 코드의 문자열 리터럴은 UTF-8로 인코딩된 것으로 간주되어 처리 속도가 느려집니다. 일반적으로 대부분의 경우 가장 엄격한 인코딩인 Latin-1을 사용하세요.
  • 사용자가 볼 수 있는 문자열은 일반적으로 번역되어 QObject::tr() 함수를 통해 전달됩니다. 이 함수는 문자열 리터럴(const 문자 배열)을 받아 모든 UI 요소에서 요구하는 대로 UTF-16 인코딩이 적용된 QString 을 반환합니다. 번역 인프라를 사용하지 않는 경우 전체 애플리케이션에서 UTF-16 인코딩을 사용해야 합니다. 문자열 리터럴 u"foo" 을 사용하여 UTF-16 문자열 리터럴을 생성하거나 Qt 특정 리터럴 u"foo"_s 을 사용하여 QString 을 직접 생성합니다.
  • QString 의 일부를 처리할 때는 각 부분을 자체 QString 객체로 복사하는 대신 QStringView 객체를 만듭니다. QStringView::toString ()을 사용하여 QString 로 다시 변환할 수 있지만 가능한 한 그렇게 하지 마십시오. 함수가 QStringView 를 반환하는 경우 가능하면 이 클래스로 계속 작업하는 것이 가장 효율적입니다. 이 API는 상수 QString 와 유사합니다.

효율적인 사용법

문자열 클래스를 효율적으로 사용하려면 다음 세 가지 개념을 이해해야 합니다:

  • 인코딩
  • 소유 및 비소유 컨테이너
  • 리터럴

인코딩

인코딩에 능숙한 Qt는 UTF-16, UTF-8, Latin-1 (ISO 8859-1) 및 US-ASCII (Latin-1과 UTF-8의 공통 하위 집합)를 어떤 형태로든 지원합니다.

  • Latin-1은 문자당 단일 바이트를 사용하는 문자 인코딩으로 가장 효율적이지만 제한적인 인코딩이기도 합니다.
  • UTF-8은 1~4바이트를 사용하여 모든 문자를 인코딩하는 가변 길이 문자 인코딩입니다. US-ASCII와 역호환되며 소스 코드 및 유사한 파일에 대한 일반적인 인코딩입니다. Qt는 소스 코드가 UTF-8로 인코딩되어 있다고 가정합니다.
  • UTF-16은 문자당 2바이트 또는 4바이트를 사용하는 가변 길이 인코딩입니다. Qt에서 사용자에게 노출되는 텍스트의 일반적인 인코딩입니다.

자세한 내용은 Qt의 유니코드 지원에 대한 정보를 참조하십시오.

다른 인코딩은 QString::fromUcs4() 또는 QStringConverter 클래스와 같은 단일 함수의 형태로 지원됩니다. 또한 Qt는 이진 데이터 저장에 적합한 인코딩에 구애받지 않는 데이터 컨테이너인 QByteArray 를 제공합니다. QAnyStringView 은 기본 문자열의 인코딩을 추적하므로 지원되는 모든 인코딩 표준을 가진 문자열에 뷰를 전달할 수 있습니다.

인코딩 간 변환은 비용이 많이 들기 때문에 가능하면 피하세요. 반면에, 특히 문자열 리터럴의 경우 보다 컴팩트한 인코딩을 사용하면 바이너리 크기를 줄일 수 있어 성능이 향상될 수 있습니다. 문자열 리터럴을 Latin-1로 표현할 수 있는 경우, 언젠가 UTF-16으로 변환해야 하는 경우에도 이러한 상충되는 요소들 간의 절충점을 잘 관리할 수 있습니다. Latin-1 문자열을 QString 로 변환해야 하는 경우 비교적 효율적으로 변환됩니다.

기능

문자열 클래스는 지원하는 기능에 따라 더 구분할 수 있습니다. 한 가지 중요한 구분은 데이터를 소유하고 제어하는지 아니면 다른 곳에 보관된 데이터를 참조할 뿐인지 여부입니다. 전자를 소유 컨테이너, 후자를 비소유 컨테이너 또는 뷰라고 합니다. 비소유 컨테이너 유형은 일반적으로 데이터의 시작과 크기에 대한 포인터만 기록하기 때문에 가볍고 저렴하지만 데이터를 사용할 수 있는 동안에만 유효하게 유지됩니다. 소유 문자열은 데이터를 저장하는 메모리를 관리하여 컨테이너의 수명 내내 데이터를 계속 사용할 수 있도록 하지만, 생성 및 소멸 시 메모리 할당 및 해제 비용이 발생합니다. 뷰는 일반적으로 소유 문자열의 함수 하위 집합을 지원하며, 기본 데이터를 수정할 수 있는 기능은 없습니다.

따라서 문자열 뷰는 파서에서와 같이 큰 문자열의 일부를 표현하는 데 특히 적합하며, 소유 문자열은 클래스의 멤버와 같이 영구적인 저장소에 적합합니다. 함수가 조각을 결합하는 등 자신이 구성한 문자열을 반환하는 경우에는 소유 문자열을 반환해야 하지만, 함수가 영구적으로 저장된 문자열의 일부를 반환하는 경우에는 일반적으로 뷰가 더 적합합니다.

Qt에서 소유 컨테이너는 데이터를 암시적으로 공유하므로 참조 카운팅으로 인해 참조로 전달하는 것보다 약간 덜 효율적이지만 큰 컨테이너를 값으로 전달하거나 반환하는 것도 효율적이라는 점에 유의하세요. Qt 클래스의 암시적 데이터 공유 메커니즘을 활용하려면 문자열을 소유 컨테이너로 전달하거나 컨테이너에 대한 참조로 전달해야 합니다. 뷰로 변환했다가 다시 변환하면 항상 데이터의 복사본이 추가로 생성됩니다.

마지막으로, Qt는 단일 문자, 문자열 목록 및 문자열 일치자에 대한 클래스를 제공합니다. 이러한 클래스는 일부 예외를 제외하고 Qt에서 지원되는 대부분의 인코딩 표준에 사용할 수 있습니다. 더 높은 수준의 기능은 QLocale 또는 QTextBoundaryFinder 과 같은 특수 클래스에서 제공합니다. 이러한 높은 수준의 클래스는 일반적으로 QString 와 그 UTF-16 인코딩에 의존합니다. 일부 클래스는 템플릿이며 사용 가능한 모든 문자열 클래스와 함께 작동합니다.

리터럴

C++ 표준은 컴파일 타임에 문자열을 생성하기 위한 문자열 리터럴을 제공합니다. 언어에 의해 정의된 문자열 리터럴과 Qt에 의해 정의된 리터럴, 소위 사용자 정의 리터럴이 있습니다. C++로 정의된 문자열 리터럴은 큰따옴표로 묶여 있으며 컴파일러가 그 내용을 해석하는 방법을 알려주는 접두사를 가질 수 있습니다. Qt의 경우 UTF-16 문자열 리터럴 u"foo" 이 가장 중요합니다. 컴파일 타임에 UTF-16으로 인코딩된 문자열을 생성하므로 런타임에 다른 인코딩으로 변환할 필요가 없습니다. QStringView 을 쉽고 효율적으로 구성할 수 있으므로 QStringView 인수를 받는 함수(또는 결과적으로 QAnyStringView)에 전달할 수 있습니다.

사용자 정의 리터럴은 C++에서 정의한 것과 동일한 형식이지만 닫는 따옴표 뒤에 접미사를 추가합니다. 인코딩은 접두사에 의해 결정되지만, 결과 리터럴은 일부 사용자 정의 유형의 객체를 구성하는 데 사용됩니다. 따라서 Qt는 자체 문자열 유형 중 일부에 대해 이를 정의합니다: QString 의 경우 u"foo"_s, QLatin1StringView 의 경우 "foo"_L1, QByteArray 의 경우 u"foo"_ba. 이들은 StringLiterals Namespace 을 사용하여 제공됩니다. 일반 C++ 문자열 리터럴 "foo" 은 UTF-8로 이해되고 QString 로 변환하므로 UTF-16은 비용이 많이 듭니다. 일반 ASCII 문자열 리터럴이 있는 경우 "foo"_L1 을 사용하여 라틴-1로 해석하면 위에 설명한 다양한 이점을 얻을 수 있습니다.

기본 문자열 클래스

다음 표는 다양한 텍스트 인코딩 표준에 대한 기본 문자열 클래스에 대한 개요를 제공합니다.

인코딩C++ 문자열 리터럴Qt 사용자 정의 리터럴C++ 문자Qt 문자소유 문자열비소유 문자열
라틴-1-""_L1-QLatin1Char-QLatin1StringView
UTF-8u8""-char8_t--QUtf8StringView
UTF-16u""u""_schar16_tQCharQStringQStringView
이진/없음-""_bastd::바이트-QByteArrayQByteArrayView
유연any----QAnyStringView

누락된 항목 중 일부는 기본 제공 및 표준 라이브러리 C++ 유형으로 대체할 수 있습니다: 소유하는 라틴-1 또는 UTF-8 인코딩 문자열은 std::string 또는 8비트 char 배열이 될 수 있습니다. QStringView 는 일부 플랫폼에서 std::u16string 또는 std::wstring과 같은 16비트 문자 배열을 참조할 수도 있습니다.

Qt는 또한 이러한 유형 중 일부에 대한 특수 목록인 QStringListQByteArrayView 과 일치자 QLatin1StringMatcherQByteArrayMatcher 를 제공합니다. 또한 컴파일 타임에 생성되는 정적 버전인 QStaticLatin1StringMatcherQStaticByteArrayMatcher 도 있습니다.

더 주목할 만한 것은

  • QStringLiteralu"foo"_s 와 동일하며 StringLiterals Namespace 없이 사용할 수 있는 매크로입니다. 가급적이면 최신 문자열 리터럴을 사용하는 것이 좋습니다.
  • QLatin1StringQLatin1StringView 의 동의어이며 이전 버전과의 호환성을 위해 존재합니다. 소유 문자열이 아니며 향후 릴리스에서 제거될 수 있습니다.
  • QAnyStringView 는 지원되는 세 가지 인코딩 중 하나를 사용하여 문자열에 대한 보기를 제공합니다. 인코딩은 데이터에 대한 참조와 함께 저장됩니다. 이 클래스는 다양한 문자열 유형과 인코딩을 사용하는 인터페이스를 만드는 데 적합합니다. 다른 클래스와는 달리 QAnyStringView 에서 직접 처리가 수행되지 않습니다. 처리는 각 인코딩의 기본 QLatin1StringView, QUtf8StringView 또는 QStringView 에서 수행됩니다. 이 클래스를 인수로 받는 자체 함수에서 동일한 작업을 수행하려면 QAnyStringView::visit()를 사용하세요.
  • ASCII가 아닌 문자가 포함된 QLatin1StringView 은 UTF-8 인코딩 소스 코드 파일에서 구성하기가 간단하지 않으며 특별한 처리가 필요합니다( QLatin1StringView 문서를 참조하세요).
  • QStringRef 는 이전 버전과의 호환성을 위해 Qt5Compat 모듈에서 사용할 수 있는 QString 의 일부에 대한 참조입니다. QStringView 로 대체해야 합니다.

추가 기능을 제공하는 더 높은 수준의 클래스는 대부분 QString, 즉 UTF-16과 함께 작동합니다. 이들은

  • QRegularExpression, QRegularExpressionMatchQRegularExpressionMatchIterator 은 패턴 일치 및 정규 표현식으로 작업합니다.
  • QLocale 는 사용자의 언어와 문화에 적합한 방식으로 숫자와 데이터를 문자열로 변환합니다.
  • QCollatorQCollatorSortKey 는 사용자의 언어, 스크립트 또는 지역과 관련하여 문자열을 비교합니다.
  • QTextBoundaryFinder 유니코드 규칙에 따라 조판할 준비가 된 텍스트를 분할하는 데 사용됩니다.
  • QStringBuilder + 연산자를 사용한 문자열 연결의 성능을 크게 향상시키는 내부 클래스인 문서를 참조하세요. QString

일부 클래스는 템플릿이거나 유연한 API를 가지고 있으며 다양한 문자열 클래스와 함께 작동합니다. 이러한 클래스는 다음과 같습니다.

어떤 문자열 클래스를 사용해야 하나요?

문자열 클래스 사용에 대한 일반적인 지침은 다음과 같습니다:

  • 복사 및 메모리 할당을 피하세요,
  • 인코딩 변환을 피하고
  • 가장 간결한 인코딩을 선택합니다.

Qt는 메모리 할당을 피하기 위한 많은 기능을 제공합니다. 대부분의 Qt 컨테이너는 데이터의 암시적 공유를 사용합니다. 암시적 공유가 작동하려면 같은 클래스의 중단 없는 체인이 있어야 합니다. QString 에서 QStringView 으로 변환했다가 다시 변환하면 데이터를 공유하지 않는 두 개의 QStrings 이 생성됩니다. 따라서 함수는 데이터를 QString (값 또는 참조 모두 작동)로 전달해야 합니다. 암시적 데이터 공유에서는 문자열의 일부를 추출할 수 없습니다. 긴 문자열의 일부를 사용하려면 명시적 데이터 공유 형태인 문자열 보기를 사용하세요.

특정 인코딩을 고수하면 인코딩 간의 변환을 줄일 수 있습니다. 예를 들어 UTF-8로 받은 데이터는 다른 인코딩으로의 변환이 필요하지 않은 경우 UTF-8로 저장 및 처리하는 것이 가장 좋습니다. 동일한 인코딩의 문자열을 비교하는 것이 가장 빠르며 대부분의 다른 작업도 마찬가지입니다. 특정 인코딩의 문자열을 자주 비교하거나 다른 인코딩으로 변환하는 경우 한 번 변환하여 저장하는 것이 유리할 수 있습니다. 일부 연산은 다양한 문자열 유형과 인코딩을 사용하기 위해 많은 오버로드(또는 QAnyStringView 오버로드)를 제공하며, 동일한 인코딩을 사용할 수 없는 경우 성능 최적화를 위해 두 번째로 선택해야 합니다. 함수를 호출하기 전에 명시적 인코딩 변환은 다른 옵션을 사용할 수 없을 때 최후의 수단으로 사용해야 합니다. Latin-1은 매우 간단한 인코딩이며, Latin-1과 다른 인코딩 간의 연산은 동일한 인코딩 간의 연산만큼이나 효율적입니다.

인코딩을 결정하는 다른 제약 조건이 없는 경우 가장 효율적인 인코딩(가장 효율적인 라틴-1, UTF-8, UTF-16 순으로)을 선택해야 합니다. 오류 처리 및 로깅의 경우 일반적으로 QLatin1StringView 으로 충분합니다. Qt에서 사용자가 볼 수 있는 문자열은 항상 QString 유형이므로 UTF-16으로 인코딩됩니다. 따라서 사용자 표시 문자열의 수명 기간 동안 QStrings, QStringViewsQStringLiterals 을 사용하는 것이 가장 효과적입니다. QObject::tr () 함수는 올바른 인코딩과 유형을 제공합니다. QByteArray 은 바이너리 데이터를 저장하는 등 인코딩이 중요한 역할을 하지 않거나 인코딩을 알 수 없는 경우 사용해야 합니다.

API 생성을 위한 문자열 클래스

최적의 API를 위한 문자열 클래스

멤버 변수

멤버 변수는 거의 모든 경우에 소유 유형이어야 합니다. 참조된 소유 문자열의 수명이 객체의 수명을 초과하도록 보장되는 경우에만 뷰를 멤버 변수로 사용할 수 있습니다.

함수 인자

함수 인수는 대부분의 경우 적절한 인코딩의 문자열 뷰여야 합니다. QAnyStringView 을 매개변수로 사용하여 둘 이상의 인코딩을 지원할 수 있으며 QAnyStringView::visit()을 내부적으로 사용하여 인코딩별 함수로 포크할 수 있습니다. 함수가 단일 인코딩으로 제한되는 경우 QLatin1StringView, QUtf8StringView, QStringView 또는 QByteArrayView 을 사용해야 합니다.

함수가 인수를 소유 문자열(보통 세터 함수)에 저장하는 경우, Qt의 암시적 데이터 공유 기능을 활용하려면 동일한 소유 문자열을 함수 인수로 사용하는 것이 가장 효율적입니다. 소유 문자열은 const 참조로 전달할 수 있습니다. 여러 소유 및 비소유 문자열 유형으로 함수를 오버로드하면 오버로드 모호성이 발생할 수 있으므로 피해야 합니다. Qt의 소유 문자열 유형은 소유하지 않는 버전 또는 QAnyStringView 로 자동 변환될 수 있습니다.

반환 값

임시 문자열은 소유 문자열로 반환되어야 하며, 일반적으로 QString 입니다. 컴파일 타임에 반환된 문자열을 알고 있다면 u"foo"_s 을 사용하여 컴파일 타임에 QString 구조를 구성합니다. 기존 소유 문자열(예: QString)이 함수(예: 게터 함수)에서 전체로 반환되는 경우 참조로 반환하는 것이 가장 효율적입니다. 나중에 임시로 반환할 수 있도록 값으로 반환할 수도 있습니다. Qt는 암시적 공유를 사용하므로 값으로 반환할 때 할당과 복사로 인한 성능 영향을 피할 수 있습니다.

기존 문자열의 일부는 적절한 인코딩의 문자열 뷰를 사용하여 효율적으로 반환할 수 있으며, 예를 들어 QStringView 을 반환하는 QRegularExpressionMatch::capturedView()를 참조하십시오.

API 사용을 위한 문자열 클래스

함수 호출을 위한 문자열 클래스

Qt API를 효율적으로 사용하려면 함수 인자 유형을 일치시켜야 합니다. 선택의 폭이 제한되어 있는 경우 Qt는 다양한 변환을 수행합니다: 소유 문자열은 소유하지 않는 문자열로 암시적으로 변환되고, 소유하지 않는 문자열은 소유하는 대응 부분을 만들 수 있습니다(예: QStringView::toString() 참조). 인코딩 변환은 많은 경우 암시적으로 수행되지만 가능하면 피해야 합니다. UTF-8에서 실수로 암시적으로 변환되는 것을 방지하려면 매크로 QT_NO_CAST_FROM_ASCII 를 활성화할 수 있습니다.

문자열을 함수에 전달하기 전에 런타임에 문자열을 어셈블해야 하는 경우 소유 문자열이 필요하므로 QString. 함수 인수가 QStringView 또는 QAnyStringView 인 경우 암시적으로 변환됩니다.

컴파일 시점에 문자열을 알면 최적화의 여지가 있습니다. 함수가 QString 를 허용하는 경우 u"foo"_s 또는 QStringLiteral 매크로를 사용하여 생성해야 합니다. 함수가 QStringView 를 기대하는 경우 일반 UTF-16 문자열 리터럴 u"foo" 로 작성하고 QLatin1StringView 를 기대하는 경우 "foo"_L1 로 작성하는 것이 가장 좋습니다. 둘 중 하나를 선택해야 하는 경우(예: 함수가 QAnyStringView 를 기대하는 경우) 가장 엄격한 인코딩(일반적으로 라틴-1)을 사용합니다.

QAnyStringView

QString API의 읽기 전용 하위 집합이 있는 Latin-1, UTF-8 또는 UTF-16 문자열에 대한 통합 보기

QByteArray

바이트 배열

QByteArrayList

바이트 배열 목록

QByteArrayMatcher

바이트 배열에서 빠르게 일치시킬 수 있는 바이트 시퀀스를 보유합니다.

QByteArrayView

QByteArray API의 읽기 전용 하위 집합을 가진 바이트 배열에 대한 보기

QChar

16비트 유니코드 문자

QCollator

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

QCollatorSortKey

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

QLatin1Char

8비트 ASCII/Latin-1 문자

QLatin1StringMatcher

라틴-1 텍스트의 하위 문자열 검색 최적화

QLatin1StringView

US-ASCII/Latin-1로 인코딩된 문자열 리터럴을 둘러싼 얇은 래퍼

QLocale

다양한 언어의 숫자와 해당 문자열 표현 간 변환

QRegularExpression

정규식을 사용한 패턴 일치

QRegularExpressionMatch

문자열에 대한 QRegularExpression 일치 결과

QRegularExpressionMatchIterator

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

QStaticByteArrayMatcher

QByteArrayMatcher의 컴파일 타임 버전

QStaticLatin1StringMatcher

QLatin1StringMatcher의 컴파일 타임 버전

QString

유니코드 문자 문자열

QStringConverter

텍스트 인코딩 및 디코딩을 위한 베이스 클래스

QStringDecoder

텍스트용 상태 기반 디코더

QStringEncoder

텍스트용 상태 기반 인코더

QStringList

문자열 목록

QStringMatcher

유니코드 문자열에서 빠르게 일치시킬 수 있는 문자 시퀀스를 보유합니다.

QStringRef

QString 하위 문자열을 둘러싼 얇은 래퍼

QStringTokenizer

지정된 구분 기호를 따라 문자열을 토큰으로 분할합니다.

QStringView

QString API의 읽기 전용 하위 집합이 있는 UTF-16 문자열에 대한 통합 보기

QTextBoundaryFinder

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

QTextStream

텍스트 읽기 및 쓰기를 위한 편리한 인터페이스

QUtf8StringView

QString API의 읽기 전용 하위 집합이 있는 UTF-8 문자열에 대한 통합 보기

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