📚책읽기

[C++] 문자, 문자열(char, wchar_t, const wchar_t*)

공대 컴린이 2022. 3. 9. 21:57
728x90
  • 문자
wchar_t wc = 65; // 아스키코드 값 : A
short s = 65;

// 메모리 상에서 상수 1과 문자 '1'은 다르게 판별된다.
char c = 1; // 숫자 그대로 '\x1'로 해석
char c = '1'; // 아스키코드 값 49로 해석

wchar_t wc = 459; // 459를 숫자로 저장하면 459의 2진수 값이 저장된다.
wchar_t wc = '459'; // 459를 문자로 저장하면 '4','5','6'의 각 아스키코드 값이 저장된다.
  • 문자열
    • 많이 쓰이는 문자열 타입은 char 과 wchar_t 가 있다.
char ch = 'a';
wchar_t wct = L'a';
    • char 자료형은 '멀티 바이트' 문자열로써 1byte와 2byte가 동시에 사용된다.
      (이로 인해 멀티 바이트는 어떤 문자열을 저장했을 때 각 문자가 몇 바이트씩 차지하는지 파악하기 어렵다.)

    • wchar_t 자료형은 2byte로 문자를 표현하는 '와이드 바이트' 시스템이다.
      이때 와이드 바이트 시스템은 '유니코드 방식'으로 볼 수 있다.
      wchar_t 자료형은 초기화 시 'L'을 붙여서 선언해야 한다.
char szChar[10] = "abcdef";
wchar_t szWChar[10] = L"abcdef";
    • 문자열도 마찬가지로 wchar_t 에서는 L을 붙여 선언한다.
      문자열은 끝에 보이지 않는 널문자('\0')가 존재하기 때문에 6글자를 선언하여도 7글자 크기의 배열을 선언해야 한다.

  • 문자열 'wchar_t'와 'const wchar_t*'의 차이점
wchar_t szWChar[10] = L"abcdef";
const wchar_t* pChar = L"abcdef";
    • wchar_t 자료형을 이용해 문자열을 선언하는 것과, const wchar_t* 의 포인터 자료형을 이용해 문자열을 선언하는 것은 언뜻 보면 같아 보이지만 아주 다른 성질을 보인다.

    • wchar_t szWChar[10] = L"abcdef"; 문자열
      위 문장은 '스택 메모리'에 10 크기의 메모리가 지정되고, 해당 메모리에 내가 작성한 문자열(L"abcdef")을 복사시킨다는 의미이다. 

      즉, wchar_t의 문자열은 배열에 복사해온 데이터를 수정하는 것이기 때문에
      szWChar[1] = 'z'; (O)
      와 같은 문자열 수정이 가능하다. 

    • const wchar_t* pChar = L"abcdef"; 문자열
      위 문장은 '스택 메모리'에 포인터 변수(pChar)가 존재하고, 타이핑한 소스코드가 'ROM(Read Only Memory, 읽기 전용) 메모리'에 존재할 때, 포인터 변수의 값에 타이핑한 소스코드 속 문자열의 시작 주소가 저장된다는 의미이다. 

      즉, pChar은 "abcdef"의 문자열을 직접 저장하는 것이 아닌, "abcdef" 문자열의 '시작 주소'를 저장하고 있는 것이다.

      따라서 아래와 같이
      pChar[1] = 'z'; (X)
      문자열 수정을 시도하는 것은 읽기 전용 메모리에 있는 소스코드를 수정하는 것과 마찬가지이기 때문에 프로그램이 정상 작동될 수 없다.

 

728x90