본문 바로가기

Information Technology/C++

[C++] std::string과 std::wstring

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)


보통 프로그램을 만들 때 많이 필요한 기능은 바로 문자열을 입력받거나 가져오는 기능입니다. 이번 포스팅에서는 C++ 언어에서 문자열을 사용하는 std::string과 std::wstring에 대해 알아보겠습니다.

.
.
using string  = basic_string<char, char_traits<char>, allocator<char>>;
using wstring = basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>>;
.
.

visual studio의 기능 중 go to definition을 통해 std::string과 std::wstring을 관찰?하면 위와 같은 코드를 볼 수 있습니다.

코드의 모든 의미를 알 수는 없지만, basic_string이라는 클래스에 각각 다른 char과 wchar_t라는 자료형으로 템플리타이즈된 클래스라는 정도로 이해할 수 있습니다.

 

char 자료형은 알고 있는데, wchar_t는 무엇인가?라고 궁금하시다면, 이번에는 go to declaration을 사용해서 관찰해보겠습니다.

typedef unsigned short wchar_t;

wchar_t는 unsigned short입니다. char은 데이터 사이즈가 작다보니 표현할 수 있는 문자에도 한계가 있기 때문에, 표현해야 할 문자가 많을 때 비교적 선택의 폭이 넓은 wchar_t를 사용한다고 합니다.

일반 영어 알파벳은 char을 사용해서 표현할 수 있지만, 한글, 러시아어 등등의 세계어를 표현해야 할 땐 wchar_t를 사용한다고 합니다.

#include <iostream>
#include <cstddef>
#include <iostream>
#include <locale>

int main(void)
{
	{
		const std::wstring texts[] =
		{
			L"Ñá", //Spanish
			L"forêt intérêt",  //French
			L"Gesäß",  //German
			L"取消波蘇日奇諾",  //Chinesse
			L"日本人のビット",  //Japanese
			L"немного русский",  //Russian
			L"ένα κομμάτι της ελληνικής",  //Greek
			L"ਯੂਨਾਨੀ ਦੀ ਇੱਕ ਬਿੱਟ",  //Punjabi
			L"کمی از ایران ", //Persian
			L"కానీ ఈ ఏమి నరకం ఉంది?", //Telugu
			L"Но какво, по дяволите, е това?" //Bulgarian
		};

		std::locale::global(std::locale(""));
		std::wcout.imbue(std::locale());

		for (size_t i = 0; i < 11; ++i)
			std::wcout << texts[i] << std::endl; 
	}
}

wstring의 사용방법은 string과 같이 std::wstring을 선언하고 변수 혹은 배열의 이름을 정해주면 됩니다.

wstring의 표현 범위를 보여드리기 위해 다양한 나라의 언어들을 texts[] 배열에 포함시켰고,

std::local()과 std::wcout 설정을 해줬습니다.(이부분은 저도 자세히 잘 모르겠습니다ㅠ).

그리고 for문을 통해 배열을 하나씩 출력해보면

모든 나라의 문자열은 아니지만, 그래도 많은 나라의 문자열을 표현하는 걸 볼 수 있습니다.

지금까지 std::string, 사실 std::wstring에 대한 간단한 설명이었습니다.

더 자세한 내용은 다음 포스팅에서 다루겠습니다.