본문 바로가기
C++/기초

C++ 기초 : 문자열 (2)

글: 시플마 2024. 4. 3.

char c = 'a';

 

위와 같은 코드가 있습니다.

char형이기 때문에 1Byte로 소문자 a를 표현합니다.

 

그럼 char형은 무조건 1Byte만 표현할 수 있냐고 하면 그건 아닙니다.

Multi Byte Character Set(멀티 바이트 캐릭터 셋) 방식이므로

가변 길이로 작동하죠.

 

 

아래 코드를 보시면

 

a, b, c는 1Byte로 표현할 수 있으므로 한 칸씩 차지하고 있지만

한과 글이라는 문자는 2Byte로 표현해야 하기 때문에

두 칸씩 차지하고 있습니다. (한은 [3] ~ [4], 글은 [5] ~ [6])

 

 

보기 편하게 음수가 아닌 양수로 표현하면

 

위와 같은 값이 배열에 담긴 것을 확인할 수 있습니다.

 

근데 이러한 Multi Byte Character Set 방식으로 작동하면

문자가 몇 개인지 파악하기 쉽지 않다는 단점이 있습니다.

 

실제로 문자는 5개이지만 7개의 칸에 값이 들어가 있죠.

 

 

[3] ~ [4]가 '한'이고, [5] ~ [6]이 '글'인지 어떻게 알까요?

 

아래 계산기를 보죠.

 

'한'의 끝부분인 [4]에 들어있는 209를 이진법으로

표현하면 '1101 0001'입니다. 앞에 110이 있습니다.

 

그럼 이번엔 '글'의 끝부분인 [6]에 들어있는 219를

이진법으로 표현하면 아래와 같습니다.

 

'1101 1011'입니다. 마찬가지로 앞에 110이 있네요.

 

110이 의미하는 것은 "2Byte 문자이기 때문에

2Byte 단위로 읽어라."라는 것입니다.

 

 

Multi Byte Character Set 방식은 1Byte와 2Byte를 혼용하기 때문에

문자 길이를 파악하려면 비트까지 확인해야 하는 것이 번거롭습니다.

 

게다가 요즘 거의 표준으로 UTF-8(유니코드) 인코딩 방식을 사용하는데

Multi Byte Character Set 방식을 사용하면 호환성 때문에

2Byte 방식으로 넘어갔다가 다시 인코딩해야 하는 문제가 있습니다.

 

이러한 이유로 Multi Byte Character Set 방식은 표준으로 쓰이고 있지 않습니다.

 

 

 


 

 

 

wchar_t 자료형을 사용하면

 

어떤 문자를 대입해도 2Byte로 표현하기 때문에

굳이 54620에 대응하는 '한'을 199와 209로 나눌 필요가 없습니다.

때문에 비트를 확인할 필요도 없어 직관적입니다.

 

 

우측에 '솔루션 탐색기'를 우클릭하여 속성에 들어간 후,

 

고급에 들어가면 '문자 집합'이라고 있습니다.

 

여기서 Multi Byte Character Set 방식과 Unicode Character Set 방식 중

어떤 방식을 사용할지 선택할 수 있습니다.

기본적으로 Unicode Character Set으로 설정되어 있을 겁니다.

 

 


 

 

 

문자열의 길이를 반환해 주는 함수가 존재합니다.

 

위 코드와 같이

전처리기 지시문을 통해 헤더 "wchar.h"를 포함하고

함수 wcslen을 사용하면 됩니다.

 

괄호 안에 무엇을 넣어야 할까요?

 

함수 wcslen은 const wchar_t 포인터를 요구합니다.

즉 주솟값을 달라는 의미이고 '배열의 이름 = 해당 배열의 시작 주소'이므로

배열명인 wc를 넣어야겠죠.

 

const가 붙었다는 것은 "해당 주소로 간 후 값을 확인만 하고 수정하지는 않을게."

라는 의미를 내포하고 있다고 볼 수 있습니다.

 

수정하지 않는다는 것은 바꿔 말하면 수정하면 안되는 값이라는 거죠?

이유는 문자열은 읽기 전용 메모리, 즉 ROM(Read-Only Memory)에 있기 때문입니다.

(정확히 표현하자면 ROM은 Code 영역과 Data 영역이 있는데 문자열은 Data 영역에 있습니다.)

 

 

실행 결과를 보죠.

 

문자열 Pizza는 문자가 5개 모인 것입니다. 이에 따라

문자열의 길이를 담을 int형 변수 iLen에 5가 저장된 것을 확인할 수 있습니다.

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 문자열 (4)  (0) 2024.04.03
C++ 기초 : 문자열 (3)  (0) 2024.04.03
C++ 기초 : 문자열 (1)  (0) 2024.04.02
C++ 기초 : 문자  (0) 2024.04.01
C++ 기초 : void  (0) 2024.03.31