Coding/Unreal, C++

[C++ Primer Plus] 3. Dealing with Data

대답해야 할 질문들

  • ASCII, Unicode, UTF가 어떤 개념인지, 어떤 차이가 있는지 설명하세요.

Simple Variables

int braincount;
braincount = 5;
  • 이 두 줄의 코드는 구체적으로 다음과 같이 작동한다.
    1. int형 데이터를 담을 수 있을 만큼의 데이터를 할당한다.
    2. 할당된 데이터 위치를 기록한다.
    3. 5라는 값을 해당 위치에 복사한다. 

Integer Types

  • 일부 언어는 정수형 데이터로 int 하나만을 지원하지만 C++은 여러 개로 구분한다.
  • 그 구분에 따라 메모리 사이즈가 다르다. 즉, 담을 수 있는 값의 범위가 다르다.
  • short, int, long, long long으로 구분한다. 차이는 다음과 같다.
    • 2bytes <= short <= int <= 4bytes <= long <= 8bytes <= long long
    • 시스템마다 short와 int 등 크기가 다른데, 보통 short는 2바이트, long이 4바이트다.

The sizeof Operator and the climits Header File

  • sizeof 연산자를 타입(type name)이나 변수에 대입할 수 있다.
  • sizeof는 연산자이기 때문에 2가지 방식으로 쓸 수 있다.
sizeof(int)
sizeof int

Initialization with C++11

  • C++11은 다양한 초기화를 지원한다.
int num = 24;	// C
int num = {24};	// C++98
int num{24};	// C++11
int num{};		// C++11, num == 0
int num = {};	// C++11, num == 0
cout << "Year = " << 1492 << "\n";
  • 위 코드에서 cout은 1492를 어떤 타입으로 저장할까?
  • 정수 타입에 있어서 C++의 규칙은 단순하다. 특별한 이유가 없으면 무조건 int다. 특별한 이유는 다음과 같다.
    1. suffix를 통해 정확히 타입을 지정한 경우
      (예. typeof(22022L) == long, typeof(22022ULL) == unsigned long long)
    2. 해당 숫자가 int의 범위를 넘어갔을 경우

Char type : char, wchar_t, char16_t, char32_t

  • char 타입도 결국은 숫자를 나타내는 자료형 중 하나다.
  • 기본적으로 모든 문자는 ASCII 문자표에 의해 7비트를 이용해 나타냈다.
  • 하지만 다른 언어의 문자도 나타내기 위해 Unicode를 만들었다.
  • UTF-8은 Unicode를 저장하는 인코딩 방식 중 하나다.
  • wchar_t는 2바이트 크기로 유니코드의 등장으로 만들어졌다.
  • char16_t와 char32_t 또한 유니코드의 크기가 최대 4바이트 되면서 만들어진 자료형이다.

The const Qualifier

  • const 한정자(qualifier)를 사용해 해당 값을 상수(constant)로 만들 수 있다.
    const int Months = 12;
  • 이는 C의 define 지시어와 비슷하다고 느낄텐데, C++ 스타일인 const가 더 낫다. 그 이유는 3가지다.
    1. 자료형을 명백하게(explicit) 나타낼 수 있다.
    2. C++의 Scoping Rule을 적용할 수 있다. (Chapter 9에서 자세히 다룸)
    3. 배열이나 스트럭쳐와 같이 더 다양한 자료형을 상수화(constanct)할 수 있다.
  • ANSI C 또한 const 한정자를 가지고 있는데, 이는 C++의 것을 가져온 것이다.

Floating-Point Numbers

  • 2가지 방법으로 실수를 정의할 수 있다.
    1. 소수점을 붙여서 정의
      float a = 1.0;
    2. E를 표기
      3.45E6
  • E 표기법은 단순하다. 예시에서 3.45를 mantissa라고 부르고, 6을 exponent라고 말한다. 실제 값은 3.45 * 10^6을 하면 된다. 부호를 추가해서 더 길게 나타내면 다음과 같다.
    +3.45E+6
  • 실수 타입도 정수처럼 여러가지로 나타낼 수 있다. 종류와 크기는 다음과 같다.
    • 4byte <= float <= 6byte <= double <= long double
  • 보통 float == 4byte, double = 8byte, long double = 10~16byte다.

Type Cast

  • type cast는 기본적으로 2가지 문법이다.
(long)thorn; // C style
long(thorn); // pure C++ style
  • 하지만 이런 캐스팅 방식이 위험하다고 느낀 C++ 제작자는 캐스팅의 범위를 제한하는 연산자를 추가했다. 그게 static_cast<type_name>(); 이다. 관련 내용은 15챕터에서 다룬다.

auto Declarations in C++11

  • C++11은 컴파일러가 type을 추측하는 기능을 추가했다. auto가 그중 하나다.
  • auto를 쓰는 이유는 STL로 인해 타입의 이름이 길어지는 것을 방지하기 위해서다. 다음 예시를 보자.
// Before C++11
std::vector<double> scores;
std::vector<double>::iterator pv = scores.begin();

// After C++11
std::vector<double> scores;
auto pv = scores.begin();