[C++] 변수 타입 : 정수

👻 들어가기에 앞서

이번 시간에는 C++ 변수 선언에 대해 알아보자. 우선 변수 설정은 다른 프로그래밍 언어와 다르지 않다. 타입과 변수 이름을 지정해주면 되는데, 우리가 이전 시간에 어셈블리어를 공부 했는데, 이제 C++을 공부하는 입장에서는 어떻게 이 둘을 연결 시킬지 감이 쉽게 잡히지 않는다. 왜 우리가 어셈블리어를 공부했는지 알아보려면 Visual Studio에서 간단한 설정만 하면 된다.

새 프로젝트를 만들게 되면 기본적으로 Hello World를 출력하는 코드가 세팅되어있는 파일이 하나 만들어지는데, 여기서 출력 부분에 브레이크 포인트를 잡고 디버그를 실행시킨 후에 디스어셈블리를 오픈시키면 우리가 왜 어셈블리어를 공부했는 지 알 수 있다.

디스어셈블리 여는 법
디버그 👉 창 👉 디스어셈블리 혹은 단축키 Ctrl+Alt+D를 입력하면 쉽게 창을 열 수 있다.

Alt Text

이러면 우리가 이제껏 공부해왔던 어셈블리어가 어떻게 기계어와 일대일 대응을 하는지, 그리고 프로젝트가 어떤 과정으로 진행되는 지에 대해 대략적으로 알 수 있다. 크게 중요한 건 아니지만 개념 이해는 필수!


🌱 TMI

프로그램 실행 : Ctrl+F5 또는 디버그 👉 디버깅하지 않고 시작 프로그램 디버그 : F5 또는 디버그 👉 디버깅 시작

💡

  1. 솔루션 탐색기 창을 사용해 파일을 추가/관리한다.
  2. 팀 탐색기 창을 사용해 소스 제어에 연결한다.
  3. 출력 창을 사용해 빌드 출력 및 기타 메시지를 확인한다.
  4. 오류 목록 창을 사용해 오류를 본다.
  5. 프로젝트 👉 새 항목 추가로 이동해 새 코드 파일을 만들거나, 프로젝트 👉 기존 항목 추가로 이동해 기존 코드 파일을 프로젝트에 추가할 수 있다.
  6. 나중에 이 프로젝트를 다시 열려면 파일 👉 열기 👉 프로젝트로 이동하고 .sln파일을 선택한다.

주석처리는 Ctrl+K+C로 한다.
주석 풀기는 Ctrl+K+U로 한다.
(Visual Studio 단축키임)


👻 변수 선언

변수 선언은 간단하다.

[타입] [이름];
or
[타입] [이름] = [초기값];

ex)
int hp = 100;

C++은 세미콜론(;)이 필수로 뒤에 붙는다. (안 붙이면 에러나니 항상 확인할 것)

💡
C++에선 컴파일러 가 알아서 변수를 section .data로 옮겨주기 때문에 어셈블러와 다르게 따로 공간을 지정할 필요가 없다. 0이 아닌 초기화 값이 있으면 .data 영역에, 초기값이 0이거나 초기값이 없는 변수라면 .bss 영역에 저장된다.

#include <iostream>
using namespace std;

int hp = 100;

int main()
{
    cout << "체력이 " << hp << " 남았습니다" << endl;
}

기본적으로 변수 선언 타입은 다음과 같다.

char a;  // 1바이트 (-128~127)
short b; // 2바이트 (-32768~32767)
int c; // 4바이트 (-21.4억~21.4억)
__int64 d; // 8바이트(long long) (어마어마하게 큼)

기본적으로 선언하면 부호 있는(signed) 변수를 선언하게 되고, 부호가 없는 정수(양의 정수)를 선언하고 싶으면 앞부분에 unsigned를 붙이면 된다.

unsigned char a; // 1바이트 (0~255)
unsigned short b; // 2바이트 (0~65536)
unsigned int c; // 4바이트 (0~42.9억)
unsigned __int64 d; // 8바이트(long long) (0~어마어마하게 큼)

💡 귀찮은데 그냥 대충 4바이트로 가면 안 될까?
👉 콘솔/모바일 게임 같은 경우는 메모리가 늘 부족하다.
👉 온라인 게임 같은 경우 4바이트 * 1만명 ... 기하급수적으로 늘어나서 최적화가 힘들게 된다.
그러니 대략적으로라도 어떤 기능을 만들 때 어느 정도 범위가 예측이 된다면 그에 맞는 타입을 사용하는 게 메모리 관리에 좋다.

cf) 이론적으로 양수만 존재할 수 있는 데이터라면 무조건 unsigned를 사용하는 게 좋아보이지만 생각보다 의견이 갈린다.

  • 레벨이 음수라는 것은 말이 안 된다. 👉 그럼 차라리 그 자리에서 프로그램을 크래시 내서 버그를 빨리 찾는 게 낫다.
  • unsigned / signed 사이의 변환에서 버그가 일어날 수 있다.

    고로 이건 팀 분위기, 코딩 스타일 에 따라서 다르다!

🪐 오버플로우(Overflow)와 언더플로우(Underflow)

예를 들어 아래와 같이 코드를 짰다고 생각해보자.

short b;
b = 32767;  // 최대값
b = b + 1;

cout << b << endl;

결과값은 32768이 나와야 할 것 같은데 막상 코드를 실행시켜보면 -32768이 나오게 된다.

왜 그럴까?
단순히 생각해보면 32768이 나와야겠지만 short로 범위를 지정해 줬기 때문에 비트 단위로 생각해보면 단순하게 1을 더해서 최상위 비트가 1이 되며 음수 최소값이 결과로 나오기 때문이다.
이 것을 정수 오버플로우(Overflow)라고 하며 반대로는 언더플로우라고 한다.

// 언더플로우 예시

ub = 0;
ub = ub - 1;
cout << ub << endl;

값이 -1이 나올 것 같지만 해당 범위의 최대값인 65535가 나오게 된다. 이를 언더플로우(Underflow)라고 한다.


👻 글을 마치며

이번 시간에는 C++ 초기세팅과 변수 타입 중에 하나인 정수에 대해 공부해보았다. 항상 프로그래밍 언어를 처음 접하면 하는 게 Hello World부터 출력하고 그 다음 정수 변수 선언이라 크게 다를 건 없었다. 하지만 출력 부분에서 코드가 달라 익숙치 않았던 점과 .cpp 파일로 실행시키면 디버그가 되지 않고 .sln(솔루션 파일)로 프로젝트를 재시작 해야 이상없이 잘 돌아간다는 것을 알게되었다. 역시 하나를 알면 둘은 모르는 프로그래밍의 세계다. 😅


소스코드 보러가기


출처
인프런 Rookies님 강의

Categories:

Updated:

Leave a comment