본문 바로가기
IT 배우기/C,C++

04. 자료형(정수형)

by To올라운더 2023. 10. 6.
반응형

1. 자료형

 - 우리는 python 을 배울 때 숫자나 문자형에 따른 자료부터

  set, dictionary, list 같이 일상생활에서 사용되는 것과는 조금 생소한 형태의 자료를 다뤄봤다.

 

 - 자료형별 특징이나 사용처의 목적에 따라 자료형을 선택하여 사용하게 되었는데,

 

 - C언어에서는 이런 숫자도 정수(int)와 실수(float, double) 이라는 좀 더 세분화된 분류가 나타고,

   분류가 더 세분화되는만큼 각각의 자료형(type)이 가지는 한계치가 있다. 

 

 - 이번 포스팅에는 이런 한계치가 생기는 이유와 정수형에 대해 알아보려한다.

 

 

2. 자료형의 크기와 한계

 - 먼저 자료형에 대해 알아보기 전 메모리(RAM)에 대한 부분을 먼저 언급할 필요가 있다.

 

 - 프로그램을 실행하려면 HDD 같은 저장 장치에서 RAM으로  프로그램을 불러와서 실행해야한다.

   일단 RAM을 필요로 하는 이유에 대해 간단히만 이야기하면, RAM은 HDD보다 속도는 빠르지만, 

   용량은 작다. RAM의 용량을 늘리면 되는게 아닌가라고 생각할 수도 있지만, 그렇게 하려면 금액이 

   올라가게 된다.

  그래서 속도가 빠르지만 비싼 RAM과 속도는 다소 느리지만 용량이 크고 저렴한 HDD를 상황에 맞게 적절히 사용하게된다. 

 

 - 여기서 RAM이나 HDD 등의 기본 단위가 우리가 흔히 듣던 Bit, Byte 같은 단위들이다.

 

 -  python에서는 이런 고민을 하지 않았었는데?

   맞다. python으로 작성한 코드도  프로그램을 동작시키기 위해서는 Memory(RAM)로 불러 오는 동일한 과정을 거쳤지만, python은 개발자가 지정하지 않아도 python이 알아서 적당히 업무를 처리했다.

   하지만 C언어의 경우에는 개발자가 메모리에 대한 부분을 고려해야한다.

 

- 왜 고민을 해야하는가? 라는 의문은 해당 언어가 나왔을 때 하드웨어의 성능 차이를 보면 알 수 있다.

  C언어의 경우, 1960년대에 등장한 언어이다 보니, 하드웨어의 메모리 등이 매우 적어 효율적으로 사용해야 했다.

  하지만 python3의 경우, 2000년 후반대에 등장하여 HW가 더 상향되어 굳이 신경 쓰지 않아도 되는 상황이 되어버렸다.

  (개인적으로 python1과 2가 아닌 3를 기준으로 삼는 이유는 python3의 경우 python2와 호환이 되지 않을 정도로 큰 변화가 생겼기 때문이다.) 

 

 - 무어의 법칙(Moore's Law) 이라고 알려진 법칙은 인텔의 공동 설립자인 무어가 18~24개월이 지나면 집적회로의 성능이 2배, 가격은 반으로 떨어진다고 얘기한 이론이다. 집적회로로 구성되는 CPU와 메모리 또한 이를 반영한다고 볼 수 있는데,

아래의 표를 보면 대략 2020년까지도 실제 무어의 예측대로 지속적인 성능 향상이 있었음을 알 수 있다.

이 내용을 우리가 지금 다루는 메모리와 연관지어 이야기하면 C언어와 python간의 등장시기가 40년 정도 차이가 나는 것을 고려해보면 메모리의 성능 차이가 약 100만배(2의 20승배)만큼 향상되어 python은 이런 효율과 관련된 고민은 필요치 않았다는 이야기이다.

 

 

 - 조금 더 이해하기 쉽게 설명하면 좁은 방에 책상과 침대, 책장 등을 모두 넣기 위해 가구들의 크기를 재고 꼼꼼히 맞춰 넣어야하는 상황이 C언어의 상황이고, python은 방이 넓어 책상과 침대를 아무대나 두더라도 전혀 문제가 되지 않는 상황이다.

반응형

 

 

2-1. 메모리의 단위

  - 컴퓨터는 0과 1밖에 모른다.

  - 이런 컴퓨터를 어떤 사람은 2진수를 사용한다. 어떤 사람은 bit 값을 사용한다라고 표현한다.

  - bit(binary digit) 값을 0과 1 대신 On/Off, 참/거짓 등으로 말하는 경우도 있다.

  - 1bit로 2가지 상태를 표현할 수 있지만, 해당 bit수가 늘어나면 2의 제곱의 갯수 만큼 늘어난다.

 - 그래서 위의 표와 같이 3bit 만큼의 메모리를 할당하면 8가지의 상태를 표시할 수 있다.  

 

 - 용도에 맞게 적당한 bit를 합쳐서 다른 단위의 이름으로 부르기도 하는데,  8bit(비트)를 1Byte(바이트)라고 표기하고, 4bit를 1nibble(니블), 16bit를 1word(워드) 라고 부른다.(nibble과 word는 사용빈도가 높지는 않고, 대부분 Byte를 사용한다.)

 

 

2-2. 자료형별 메모리 할당과 제한 값1

 - 지난 포스팅에서 C 언어의 자료형은 자료형에 따라 할당되는 메모리가 다르다는 말을 다시 기억해보자.

 

 - 정수형(int)과 실수형1(float) 는 4Byte, 실수형2(double)은 8Byte를 할당 받게 되는데

   정수형(int)을 기준으로 설명해보면

   4 Byte > 4 * 8 bit  > 32 bit > 2의 32승 개의 상태(값)를 표시할 수 있다.

 

 - 그래서 부호가 없는 (unsigned) int 일 경우, 0 ~ 2의 32승(4,294,967,295) 까지의 정수를 출력할 수 있고,

 - 첫번째 bit로 양수와 음수를 나타내게 되는 (signed) int의 경우, 

    - 2의 31승(- 2,147,483,648) ~ + 2의 31승 -1 (+ 2,147,483,647)까지 나타낼 수 있게 된다. 

 - 다시 말하면, 정수형 unsigned int는 4,294,967,297 이라는 값을 출력할 수 없다는 의미이다.

 - 이런 내용이 메모리 할당에 대한 제한 값이 있다는 의미이다.

 - 반드시, 데이터 타입(자료형)을 고려할 때는 최대값이라는 부분을 염두에 두어야 한다는 의미이고,

   이런 범위를 벗어난 데이터를 저장하게 되면 오버플로우(overflow)라고 부르는 에러가 발생하게 된다.

 

 

 

2-3. 자료형별 메모리 할당과 제한 값2

  - 위의 내용을 이해했다면 이제 아래의 간단한 표만으로도 해당 내용을 유추할 수 있다.

정수형 타입 할당되는 메모리의 크기 데이터의 표현 범위
(signed) short 2 바이트 - 32,768 ~ 32,767
unsigned short 2 바이트 - 0 ~ 65,535
(signed) int 4 바이트 - 2,147,483,648 ~ 2,147,483,647
unsigned int 4 바이트 - 0 ~ 4,294,967,295
(signed) long 4 바이트 - 2,147,483,648 ~ 2,147,483,647
unsigned long 4 바이트 - 0 ~ 4,294,967,295

 - 그런데 여기서 이상한 점을 찾을 수 있는데, int와 long이 똑같은 4바이트라는 것이다. 왜 똑같은 것을 2개나 만들었을까?

 

 - 이유는 long은 처음부터 4바이트 였으나, int는 CPU의 레지스터와 동일한 크기를 가지는 타입이라는 PC환경에 따라 유동적인 크기를 가지다 보니, 이전 16bit 일 때는 2바이트(16bit)가 1 int , 32bit 부터는 4바이트(32bit)가 1 int로 변경되었기 때문이다. 개인 컴퓨터 환경에 따라 변경되거나 확장될 수 있는 단위다 보니, 64bit 이상에서는 최초 정의한 레지스터와 동일한 크기라는 단위를 벗어나 4바이트로 고정되었다. (64bit PC가 보편화된 요즘 int 또한 4바이트라고 생각해도 무관한 상황이 되었다.)

 

여기까지가 정수형 자료타입에 대한 설명이었으나, 앞으로 이어질 실수형의 경우

고정소수점과 부동소수점에 대한 내용이 길어질 것으로 예상되어 실수형은 다음 포스팅에서 다뤄보겠습니다.

 

C언어를 다시 배우다보니 컴퓨터에 대한 이해도 깊어지지만

대학생때는 생각지도 못했던 시대적 흐름이나 역사적인 부분도 함께 알아가야 이해가 되는 것 같다는 생각이 듭니다.

반응형

'IT 배우기 > C,C++' 카테고리의 다른 글

03. 상수와 변수  (0) 2023.10.05
02. 주석  (1) 2023.10.04
01. 기본구조(Hello, World)  (0) 2023.10.04
0. 환경 셋팅하기(Visual Studio Code)  (0) 2023.10.03
이제 진짜 Hello, World 다.  (0) 2023.10.02