본문 바로가기

C++

C++ 토막 지식(19.01.09 - 10)

1. std::endl 은 output 버퍼를 비워주고(flush), '\n'은 그렇지 않다. 버퍼를 자주 비워줘야 한다면 endl 을 쓰고 그렇지 않다면 '\n' 을 사용하면 된다. 버퍼에 대해서는 좀 더 배워서 정리할 예정이다.

2. char 타입의 데이터는 -128 부터 127 까지의 정수를 담을 수 있다. 1 바이트만 차지하기 때문에 숫자를 담기 위한 자료형으로 가끔 사용되기도 하지만, 실제로는 ASCII 문자를 담기 위해 사용한다. ASCII 문자는 문자에 숫자를 매겨 표현하는 것인데 그 범위가 0에서 127까지만 있으면 숫자, 영어 소문자, 대문자, 특수문자가 포함되므로 char 타입에 맞다. 

하지만 프로그램에서 -128 부터 127 까지의 수로는 한국어나 중국어, 일본어 등 외국어까지 표현할 수 없다. 그래서 C++는 wchar_t라는 좀 더 큰 문자 데이터 형을 만들었다.

3. 우선순위가 같은 산술 연산자가 두 개 있다면, 왼쪽에 있는 것부터 실행된다. 


4. bool 타입의 자료형은 사실 1 비트만 있으면 되지만 1바이트가 할당된다. 그 이유는 CPU 가 메모리를 바이트 단위로 할당해주기 때문이다. 따라서 아무리 작아도 1 바이트는 할당해야 한다.(출처)


5. setw 를 사용해서 출력되는 정보들이 몇 칸을 차지할지 정할 수 있다. 예를 들어 아래 예제에서는 LOCATION 가 8 칸을, POPULATION에 12 칸을 차지하도록 한다. setw을 적용한 정보들은 오른쪽 정렬된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <iomanip> // for setw (input output manipulator)
using namespace std;
int main()
{
  long pop1=2425785, pop2=47, pop3=9761;
  cout << setw(8<< "LOCATION" << setw(12<< "POPULATION" << endl
       << setw(8<< "Portcity" << setw(12<< pop1 << endl
       << setw(8<< "Hightown" << setw(12<< pop2 << endl
       << setw(8<< "Lowville" << setw(12<< pop3 << endl;
  return 0;
}
 
// 결과
/*
LOCATION  POPULATION
Portcity     2425785
Hightown          47
Lowville        9761
*/
cs


6. + 나 * 와 같은 산술 연산자는 이항 연산자다. 만약, 두 항이 각각 다른 데이터 타입이라면 순서(Order)가 낮은(Low) 타입의 데이터가 순서가 높은(High) 타입의 데이터의 자료형으로 변한다. 


그렇기 때문에 아래 예제에서 int 타입과 float 타입의 변수를 곱하는 것이므로 값은 float 이 되며, float 이 double 에 대입되므로 최종적으로 totalWeight 는 double 타입의 변수가 된다.


1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main()
{
  int count = 7;
  float avgWeight = 155.5F;
  double totalWeight = count * avgWeight;
  cout << "totalWeight = " << totalWeight << endl;
  // totalWeight = 1088.5
  return 0;
}
cs


7. 데이터 타입을 casting 하는 방법은 여러가지가 있다. 전자처럼 static_cast 를 하는 방법도 있고, 후자처럼 할 수도 있다. 그 중에서 전자가 권장되는데 그 이유는 일단 전자가 눈에 띄기 때문에 찾기 쉽고, 검색할 때도 static_cast를 찾으면 되기 때문에 쉽기 때문이다. 


1
2
3
4
5
6
// 전자
aCharVar = static_cast<char>(anIntVar);
 
// 후자
aCharVar = (char)anIntVar;
aCharVar = char(anIntVar);
cs


8. casting 은 꼭 필요할 때만 하는 것이 좋다.