본문 바로가기

C++ 일기

4. 자료형 (Data Type)

프로그램의 데이터에는 여러 종류가 있는데, 이를 데이터 타입이라고 한다.

프로그램을 실행할 때 변수, 함수등을 저장할 공간이 필요한데, 필요한 양 만큼의 정보를 저장할 수 있도록

정해진 공간만큼 메모리에게 빌려달라고 미리 알려주는 것이다.

이 부분에 대해서는 3. 변수(Variable)에서 다룬 적이 있었다.

자료형은 크게 정수형과 실수형으로 나뉘어진다.

 

자료형의 구분1 출처 : ITisTrue 티스토리
자료형의 구분2 출처 : ITisTrue 티스토리

위와 같이 저장하고 싶은 자료에 따라서 자료형이 정해져 있으며,

해당 자료를 저장하는데 필요한 메모리 공간도 자료형마다 다르기 때문에 자료형은 각각 다른 크기를 갖고있다.

 

컴퓨터는 0과 1을 구분하는 bit로 모든 데이터를 저장하고 연산하고 처리한다.

이 bit가 8개 모여서 2의 8제곱만큼의 수를 표현할 수 있는 단위가 byte이다.

최소단위인 byte를 기준으로 자료형에 따라 크기가 정해져있다.

 

자료형은 기본적으로 양수와 음수의 구분이 존재하며,

위의 표에 unsigned가 붙은 자료형들은 음수를 사용하지 않는 대신 양수의 범위가 2배로 늘어난다.

 

3. 변수(Variable) 부분에서 다루었던 호텔의 예시로 들자면,

자료형은 같은 규격의 객실이 나열되어있는 동(101동, 102동...)이고,

해당 객실의 평수가 곧 범위이다.

예를 들어, char동의 객실 규격은 -128 ~ 127이 들어갈 수 있는 규격인 것이다.

 

 

 

#include<iostream>

int main()
{
   int num = 5;
}

따라서, 변수를 선언할 때의 일련의 과정을 위의 변수 선언을 예로 설명하자면,

1. 자료형을 선언한다.(int) -> 객실의 규격을 정한다. (고객이 입실할 객실의 규격은 int이다.)

2. 변수의 이름을 선언한다. (num) -> 객실의 이름을 정한다. (int동의 num실을 빌릴 것이다.)

3. 변수를 초기화한다.(= 5;) -> 객실에 입실할 고객을 정한다. (int 동의 num호실에는 5 고객이 입실한다.)

위와 같은 과정으로 비유할 수 있다.

 

 

 

 

 

가끔 변수가 연산되는 과정에서 변수의 값이 해당 변수의 자료형이 갖고있는 최대값 혹은 최소값을 넘어서는 경우가 생기기도 하는데, 이를 오버플로우 혹은 언더플로우라고 한다.

 

오버플로우란 변수의 값이 정해진 자료형의 최대값보다 높아지는 경우를 말하는데, 이 경우 최솟값으로 바뀌는 현상이다.

언더플로우는 반대로, 변수의 값이 정해진 자료형의 최소값보다 낮아지는 경우에 최대값으로 바뀌는 현상을 말한다.

오버플로우와 언더플로우의 이해를 돕기위한 사진. 출처 : 코딩도장

위의 그림과 같은 방식으로 데이터를 저장하게 되는데,

최대값 혹은 최소값을 넘어가게 된다면 그와 연결되어있는 최대값으로 변수의 값이 변해버리게 되는 방식이다.

 

#include<iostream>

int main()
{
   short a = 32767;		// short 자료값의 범위는 -32768 ~ 32767 이다
   
   a = a + 1;
   // 이 때, a의 값은 32768이 되려고 하지만, 최대값을 넘게되어 최소값인 -32768이 된다
   std::cout << a;	// 출력되는 값은 -32768
   
   a = -32768;
   
   a = a - 2;		// 오버플로우, 혹은 언더플로우가 일어나면 그 값이 그대로 이어져 다시 다음으로 넘어가게된다.
   std::cout << a;	// 이 때, a의 값은 -32770가 되려고 하지만 역시 언더플로우가 일어난다
   					// 총 2를 빼야하는데, 1을 뺐을 때 언더플로우가 일어나 최대값인 32767이 되고
   					// 그 수에서 다시 1을 빼주어야 하기 때문에 a의 출력값은 32766이다.
  

}

 

위의 식처럼 오버플로우가 언더플로우가 일어나게 된다.

오버플로우와 언더플로우를 이해할 때에는 위의 '오버플로우와 언더플로우의 이해를 돕기위한 사진' 처럼 자료형의 구조를 다이얼의 형태로 이해하면 쉽다.

 

 

변수를 선언할 때, 해당 변수가 대략 어떤 값 까지 낮아지고 혹은 높아질지를 잘 파악하여 올바른 자료형을 선언해야

오버플로우와 언더플로우가 일어나 의도와 다르게 프로그램이 실행되는 것을 방지하여야 한다.

또한, 이와 반대로 불필요하게 크기가 큰 자료형을 선언할 경우, 메모리의 공간이 줄어들어 효율적인 실행이 불가능해지기 때문에, 되도록이면 변수의 크기를 잘 상정하여 올바른 자료형을 선언해야 한다.

 

오버플로우와 언더플로우 외에도, 컴퓨터의 연산은 4바이트로 묶어서 연산하는 것이 효율적이기 때문에,

연산의 효율을 따질 때는 4바이트 단위로 자료형을 선언하는 것이 좋으며,

메모리의 절약을 따질 때는 전술했듯 변수의 범위를 잘 계산하여 최소한으로 자료형을 선언하는 것이 유리하다.

'C++ 일기' 카테고리의 다른 글

6 - 1. 산술연산자 (+, -, *, /, %)  (0) 2024.02.20
5. std::cout과 std::cin (C++의 입출력)  (0) 2024.02.20
3. 변수 (Variable)  (0) 2024.02.20
2. main함수 (int main())  (0) 2024.02.20
1. 전처리기 (#include)  (0) 2024.02.20