[C++] 변수와 상수, 그리고 데이터 타입


Study/C , C++ , MFC  2020. 3. 10. 15:25

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


이 글은 C++에서 사용되는 변수와 상수, 그리고 데이터 타입에 대한 글입니다.


C++에서 변수 선언법은 다른 언어와 마찬가지로 「데이터 타입 변수명」으로 나타냅니다.

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
  // 정수형 타입
  // char는 1byte : -127 ~ +128
  char var1 = 'a';
  // short는 2byte : -32,768 ~ +32,767
  short var2 = 100;
  // int는 4byte : -2,147,483,648 ~ +2.147,483647
  int var3 = 1000;
  // long는 4byte : -2,147,483,648 ~ +2.147,483647
  long var4 = 10000;

  // 실수형 타입
  // float는 4byte : -3.4e-37 ~ +3.4e+37
  float var5 = 200;
  // double는 8byte : -1.7e-307 ~ +1.7e+307
  double var6 = 2000;
  
  cout << "char : " << sizeof(var1) << "bit : " << CHAR_MIN << " ~ " << CHAR_MAX << endl;
  cout << "short : " << sizeof(var2) << "bit : " << SHRT_MIN << " ~ " << SHRT_MAX << endl;
  cout << "int : " << sizeof(var3) << "bit : " << INT_MIN << " ~ " << INT_MAX << endl;
  cout << "long : " << sizeof(var4) << "bit : " << LONG_MIN << " ~ " << LONG_MAX << endl;
  cout << "float : " << sizeof(var5) << "bit : " << FLT_MIN << " ~ " << FLT_MAX << endl;
  cout << "double : " << sizeof(var6) << "bit : " << DBL_MIN << " ~ " << DBL_MAX << endl;

  return 0;
}

여기서 정수형은 소수점이 없는 수이고 실수는 소수점이 있는 수입니다.

특히나 c++에서는 많이 사용하는 자료형은 int와 float입니다. 다른 데이터 타입은 그렇게 자주 사용하지 않습니다. 한 20~30년 전이야 하드웨어가 지금처럼 좋지 않았을 때는 메모리를 아낀다고 세부적으로 메모리 계산해가며 변수선언 했지만, 지금이야 메모리가 몇 기가 단위인데 short 타입을 int로 쓴다고 크게 시스템이 느려지지 않습니다.


java나 C#과 다른 점은 string 객체가 없습니다.

사실 string은 원시 데이터 타입(Primitive type)이 아니고 클래스 타입입니다.

사실 java나 C#에서의 문자열은 byte배열(unsigned char(음수가 없는 char))타입입니다. 그것에 관한 자료형은 wchar_t 자료형이 있습니다.

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
  // 문자열은 배열식으로 할당되고 변수는 포인터를 받는다.  
  const wchar_t* var = (L"안녕하세요. 명월입니다.");
  // wchar_t타입은 cout으로 출력이 되지 않는다.
  // wcout 타입으로 출력을 해야한다.
  
  // 그냥 wcout를 사용하면 콘솔에서 글자가 깨진다. 한글 설정을 해야한다.
  wcout.imbue(locale("kor"));
  wcout << var << endl;

  return 0;
}

C++이 java와 C#과 다르게 문자열 다루기가 매우 까다롭습니다. c++이 다른 언어보다 어렵다는게 이 문자열 다루기가 매우 까다로워서 그렇습니다.

c++에서 문자열을 이해할려면 문자열의 변천사도 알아야 합니다.

처음에는 const char에서 const wchar_t로 바뀌었고 이게 ascii코드에서 멀티바이트코드, 현재는 유니코드를 가장 많이 사용합니다.

유니코드의 문자열 타입은 wchar_t입니다.


또 문자열은 포인터로 받았는데, 이건 포인터와 배열을 이해해야 하는 부분이기 때문에 여기서는 일단 생략하겠습니다.


wchar_t*앞에 const의 키워드를 사용했습니다.

const의 키워드는 변수와 상수의 차이입니다.

변수는 값이 변하는 변수이고 상수는 값이 변하지 않는 변수입니다.

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
  // const가 없는 변수는 값이 변할 수 있다.
  int a = 0;
  // 변수에 값을 재설정이 가능하다.
  a = 10;
  
  // 상수 선언 b는 1로 선언이 되었으면 값이 변할 수 없다.
  const int b = 1;
  // 에러가 발생한다.
  b = 11;

  return 0;
}

에러가 발생했습니다. const가 설정되면 값이 바뀌지 않는 상수의 개념이 됩니다.

문자열에 const가 붇는 이유는 역시 포인터의 개념을 알아야 하기 떄문에 또 생략합니다.


참 string개념 때문에 설명이 복잡해졌습니다.

저도 예전에도 그랬지만 C++로 개발하다가 보면 string때문에 정말 짜증나는 일이 많습니다...ㅎㅎㅎ

개인적으로 문자열만 좀 사용하기 쉬우면 java나 C#보다는 C++를 쓸텐데 말입니다. Java와 C#은 그놈의 가비지 컬렉션... 짜증납니다.


여기까지 C와 C++에서 사용되는 변수, 그리고 데이터 타입에 대한 글이었습니다.


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