[C++] 리터럴 문자열(const char*, const wchar_t*)과 typedef, operator의 사용법


Study/C , C++ , MFC  2020. 4. 2. 01:33

안녕하세요. 명월입니다.


이 글은 C++에서 리터럴 문자열(const char*, const wchar_t*)과 typedef, operator의 사용법에 대한 글입니다.

리터럴 문자열(const char*, const wchar_t*)

우리가 프로그램을 작성하면 가장 많이 사용하는 값이라고 하면 수보다는 문자열을 사용하는 경우가 많습니다. c++에서는 이 문자열을 const char*와 const wchar_t*로 표현합니다.

const char*와 const wchar_t*는 일반 ascii코드와 유니코드의 차이입니다.

먼저 const char*에 대해서 설명하겠습니다.

영어로 된 문자열을 작성하면 문자 코드는 char로 ascii코드로 정의됩니다. 예를 들면 소문자 a는 97이고 대문자 A는 65인 것입니다.

링크 - https://ko.wikipedia.org/wiki/ASCII


문자열로 우리가 "abc"를 작성하면 자연스럽게 배열 방식으로 new char[3]{97,98,99}로 생성됩니다. 그렇기 때문에 변수에서는 char의 포인터로 값을 받는 것입니다.

#include <stdio.h>
// 실행 함수
int main()
{
  // 문자열 변수 저장
  const char* a = "abc";
  const char* b = "abc";

  // 포인트 값 콘솔 출력
  printf("%d\r\n", a);
  printf("%d\r\n", b);

  return 0;
}

위 a와 b는 분명히 다른 변수에 각각 abc의 값을 넣었습니다. 그러나 실제 포인트의 값을 보면 같은 값을 가르킵니다.

우리가 생각하기에 "abc"를 할 때마다 new char[3]{97,98,99}로 생각할 것 같지만 실제로는 "abc"로 같은 문자열이 있으면 새로 메모리 할당을 하는 것이 아니라 같은 메모리 참조를 해버립니다.

왜냐하면, 소스 코드도 텍스트로 이루어진 텍스트 파일인데 소스 코드에 고정된 "abc"의 텍스트를 참조하는 것입니다. 즉, 소스코드에 같은 문자열이 있으면 같은 값을 참조하는 것입니다. 이것이 리터럴 문자열입니다.

여기서 a와 b를 const를 안하고 char*로 할경우 b[2] = 65이런식으로 수정을 하면 a도 값이 변경되는 결과가 나옵니다.(실제는 char*로 문자열 값을 받을 수도 없습니다.)

(※참고 const는 상수 설정입니다. 즉, 값을 변경할 수 없습니다.)


다시 const char*와 const wchar_t* 차이는 실제 const char는 ascii코드로 이루어진 0에서 125개의 문자 밖에 못쓰지만 우리가 자주 사용하는 한글 문자는 이 125개로 문자를 모두 나타낼 수가 없습니다.

그래서 있는 것이 멀티바이트 문자 집합과 유니코드가 있습니다. 멀티바이트 문자 집합은 예전에 MS에서 강력하게 밀던 문자 코드인데 표준으로 채택되지 못했습니다. 즉, 알 필요도 없습니다. 표준도 아닌 문자 타입..

다른 프로그램 언어, 즉 Java나 C#에서의 문자 코드는 모두 유니코드를 사용하기 때문에 c++에서도 wchar를 이용해서 문자코드를 사용하는 것이 좋습니다.

typedef

프로그램을 작성하다 보면 긴 클래스명 또는 포인터를 간단한 별칭으로 변경하거나 연산자 타입을 조금 편하게 바꾸고 싶을 때가 있습니다.

예를 들면, const char*나 const wchar_t*보다 String이나 wString으로 바꾸어서 사용하고 싶은 것 입니다.

#include <stdio.h>
#include <iostream>
using namespace std;
// 별칭만들기
// const char*는 String으로 사용한다.
typedef const char* String;
// const wchar_t*는 wString으로 사용한다.
typedef const wchar_t* wString;
// 실행 함수
int main()
{
  // 그냥 wcout를 사용하면 콘솔에서 글자가 깨진다. 한글 설정을 해야한다.
  wcout.imbue(locale("kor"));
  // String으로 사용했지만 내부에서는 const char*이다.
  String test = "hello world";
  // wString으로 사용했지만 내부에서는 const wchar_t*이다
  wString test2 = L"안녕하세요";

  // 콘솔 출력
  cout << test << endl;
  wcout << test2 << endl;

  return 0;
}

이 typedef는 구조체를 설정할 수 있는데, c++에서의 구조체는 클래스와 별 차이가 없습니다.

#include <stdio.h>
#include <iostream>
using namespace std;
// struct 선언
typedef struct Node {
// 접근 제한자
private:
  // 변수 선언
  int data1;
  int data2;
public:
  // 프로퍼티 data1 값 설정
  void setData1(int data1)
  {
    this->data1 = data1;
  }
  // 프로퍼티 data2 값 설정
  void setData2(int data2)
  {
    this->data2 = data2;
  }
  // data1과 data2의 값을 더한 값을 출력
  int sum()
  {
    return this->data1 + this->data2;
  }
};

int main()
{
  // Node struct 선언
  Node node;
  // data1의 값을 10으로 설정
  node.setData1(10);
  // data2의 값을 20으로 설정
  node.setData2(20);
  // 10과 20을 더한 값을 출력
  cout << "Node sum : " << node.sum() << endl;

  return 0;
}

operator

operator는 연산자를 사용해 함수를 사용하게 하는 방법입니다. 연산자 종류는 예전에 설명한 적이 있습니다.

링크 - [C++] 연산자

#include <stdio.h>
#include <iostream>
using namespace std;
// struct 선언
typedef struct Node {
private:
  // 변수 선언
  int data;
public:
  // 프로퍼티 data 값 설정
  void setData(int data)
  {
    this->data = data;
  }
  // 프로퍼티 data 값 반환
  int getData()
  {
    return this->data;
  }
  // Node 구조체에 연산자 +를 사용하면 안의 data값을 더한다.
  Node operator+(Node node) 
  {
    // 결과 변소
    Node ret;
    // Node a + Node b로 표현하면 결과 변수에 값을 넣는다.
    ret.setData(data + node.data);
    // 변수 리턴
    return ret;
  }
  // 값 덮어 씌우기
  void operator<<=(Node node) {
    // 덮어 씌우기
    data = node.data;
  }
};

int main()
{
  // 변수 선언
  Node node1;
  // node1에 10을 설정
  node1.setData(10);
  // 변수 선언
  Node node2;
  // node2에 20을 설정
  node2.setData(20);

  // node1(10)과 node2(20)를 더한다.
  Node node3 = node1 + node2;
  // 결과 출력
  cout << "Node sum : " << node3.getData() << endl;
  // 덮어 씌우기
  node1 <<= node2;
  // node1의 값을 출력한다.
  cout << "Node overwrite : " << node1.getData() << endl;

  return 0;
}

위 예제를 보면 원시 데이터가 아닌 구조체로 된 Node를 더하면 Node 안에 data 값이 더해 집니다. 10을 설정한 node1과 20을 설정한 node2를 더해서 node3의 data가 30으로 설정된다.

결과가 30이 나왔습니다. 제가 연산자 +를 써서 잘 이해가 안될 수도 있어서 아예 c++에서 사용하지 않는 <<=라는 연산자를 설정했습니다.

<<=는 Node a <<= Node b라고 설정하면 b의 data가 a의 data를 설정하는 연산자를 생성했습니다.

위 예제를 보니 node1이 10으로 설정했는데 20의 값으로 변경된 것을 확인할 수 있습니다.


여기까지 C++에서 리터럴 문자열(const char*, const wchar_t*)과 typedef, operator의 사용법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.