..

Search

9) 기본 타입

9) 기본 타입

기본 타입


기본 타입

타입(data type)이란 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 합니다.

C++에서는 여러 형태의 타입을 제공하고 있는데, 이것을 기본 타입이라고 합니다.

이러한 기본 타입은 크게 정수형, 실수형, 문자형 그리고 bool형 타입으로 나눌 수 있습니다.


정수형 타입

C++에서 정수란 부호를 가지고 있으며, 소수 부분이 없는 수를 의미합니다.

 

정수형 데이터에 unsigned 키워드를 추가하면, 부호를 나타내는 최상위 비트(MSB, Most Significant Bit)까지도 크기를 나타내는 데 사용할 수 있습니다.

unsigned 정수로는 음의 정수를 표현할 수는 없지만, 0을 포함한 양의 정수는 두 배 더 많이 표현할 수 있게 됩니다.

음의 정수까지도 표현할 수 있는 signed 키워드는 모든 타입에서 기본적으로 생략할 수 있습니다.

 

최상위 비트(MSB, Most Significant Bit)란 1바이트를 구성하는 8개의 비트 중 최고값을 갖는 비트를 의미합니다.

 

다음 표는 각각의 정수형 타입에 따른 메모리의 크기 및 데이터의 표현 범위를 나타냅니다.

정수형 타입 할당되는 메모리의 크기 데이터의 표현 범위
(signed) short 2 바이트 -215 ~ (215 - 1)
unsigned short 2 바이트 0 ~ (216 - 1)
(signed) int 4 바이트 -231 ~ (231 - 1)
unsigned int 4 바이트 0 ~ (232 - 1)
(signed) long 4 바이트 -231 ~ (231 - 1)
unsigned long 4 바이트 0 ~ (232 - 1)
unsigned long long 8 바이트 0 ~ (264 - 1)

 

정수형 데이터의 타입을 결정할 때에는 반드시 자신이 사용하고자 하는 데이터의 최대 크기를 고려해야 합니다.

타입이 표현할 수 있는 범위를 벗어난 데이터를 저장하면 오버플로우(overflow)가 발생해 전혀 다른 값이 저장될 수 있습니다.

 

오버플로우(overflow)란 해당 타입이 표현할 수 있는 범위를 넘는 데이터가 저장될 때 발생하는 현상을 가리킵니다.

오버플로우가 발생하면 최상위 비트(MSB)를 벗어난 데이터가 인접 비트를 덮어쓰므로, 잘못된 결과를 얻을 수 있습니다.

 

다음 예제는 int형 타입의 변수에 해당 타입이 저장할 수 있는 최댓값과 그 최댓값을 넘는 숫자를 대입하는 예제입니다.

예제

int num = 2147483647;

cout << "변수 num에 저장된 값은 " << num << "입니다." << endl;  

 

num = 2147483648;

cout << "변수 num에 저장된 값은 " << num << "입니다." << endl;

코딩연습 ▶

실행 결과

변수 num에 저장된 값은 2147483647입니다.

변수 num에 저장된 값은 -2147483648입니다.

 

위의 두 번째 실행 결과를 살펴보면, 변수 num에 양수를 대입했지만 음수로 저장된 것을 확인할 수 있습니다.

이처럼 오버플로우가 발생하면 전혀 예상치 못한 결과를 얻을 수 있으므로, 데이터를 저장할 때는 언제나 해당 데이터 타입의 최대 크기까지 고려해야 합니다.

 

컴퓨터는 내부적으로 정수형 중에서도 int형의 데이터를 가장 빠르게 처리합니다.

따라서 정수형 데이터는 보편적으로 int형을 가장 많이 사용합니다.


실수형 타입

C++에서 실수란 소수부나 지수가 있는 수를 가리키며, 정수보다 훨씬 더 넓은 표현 범위를 가집니다.

하지만 컴퓨터에서 실수를 표현하는 방식은 오차가 발생할 수 밖에 없는 태생적 한계를 지닙니다.

이러한 실수형 데이터의 오차는 C++뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제입니다.

 

C++에서 실수를 표현하는 방식에 대한 더 자세한 사항은 C++ 부동 소수점 수 수업에서 확인할 수 있습니다.

C++ 부동 소수점 수 수업 확인 =>

 

실수형 타입 할당되는 메모리의 크기 데이터의 표현 범위
float 4 바이트 (3.4 X 10-38) ~ (3.4 X 1038)
double 8 바이트 (1.7 X 10-308) ~ (1.7 X 10308)
long double double형과 동일함. double형과 동일함.

 

다음 예제는 소수점을 16자리 가지는 실수를 float 타입과 double 타입의 변수에 각각 대입하는 예제입니다.

예제

float num01 = 3.1415926535897932;  // float 타입의 유효 자릿수는 소수점 6자리

cout << "변수 num01에 저장된 값은 " << num01 << "입니다." << endl;  

 

double num02 = 3.1415926535897932; // double 타입의 유효 자릿수는 소수점 15자리

cout << "변수 num02에 저장된 값은 " << num02 << "입니다." << endl;

코딩연습 ▶

실행 결과

변수 num01에 저장된 값은 3.14159274101257324219입니다.

변수 num02에 저장된 값은 3.14159265358979311600입니다.

 

위의 예제에서 변수 num01에는 소수점 6자리까지만 정확한 값이 저장되어 있고, 소수점 7자리부터는 틀린 값이 저장되어 있습니다.

또한, 변수 num02에는 소수점 15자리까지만 정확한 값이 저장되어 있고, 소수점 16자리부터는 틀린 값이 저장되어 있는 것을 확인할 수 있습니다.

 

이처럼 실수형 데이터의 타입을 결정할 때에는 표현 범위 이외에도 유효 자릿수를 반드시 고려해야 합니다.

실수형 타입 지수의 길이 가수의 길이 유효 자릿수
float 8 비트 23 비트 소수 부분 6자리까지 오차없이 표현할 수 있음.
double 11 비트 52 비트 소수 부분 15자리까지 오차없이 표현할 수 있음.

 

과거에는 실수를 표현할 때 float형을 많이 사용했지만, 하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용합니다.


문자형 타입

C++에서 문자형 데이터란 작은 정수나 문자 하나를 표현할 수 있는 타입을 가리킵니다.

컴퓨터는 2진수밖에 인식하지 못하므로 문자도 숫자로 표현해야 인식할 수 있습니다.

따라서 어떤 문자를 어떤 숫자에 대응시킬 것인가에 대한 약속이 필요하게 됩니다.

이러한 약속 중에서 가장 많이 사용되는 것이 바로 아스키코드(ASCII)입니다.

 

아스키코드(ASCII)는 영문 대소문자를 사용하는 7비트의 문자 인코딩 방식입니다.

아스키코드는 문자를 7비트로 표현하므로 총 128개의 문자를 표현할 수 있습니다.

 

문자형 타입 할당되는 메모리의 크기 데이터의 표현 범위
(signed) char 1 바이트 2-7 ~(27 - 1)
unsigned char 1 바이트 0 ~ 28

bool 형 타입

이전의 C++에서는 C언어와 마찬가지로 0인 값을 거짓으로, 0이 아닌 값을 참으로 인식했습니다.

하지만 C++11부터는 bool형이라는 새로운 타입을 제공하고 있습니다.

bool형은 참(true)이나 거짓(false) 중 한 가지 값만을 가질 수 있는 불리언 타입입니다.

 

C++에서는 어떤 값도 bool형으로 묵시적 타입 변환이 가능합니다.

이때 0인 값은 거짓(false)으로, 0이 아닌 값은 참(true)으로 자동 변환됩니다.


auto 키워드를 이용한 선언

C++11부터는 변수의 초기화 값에 맞춰 변수의 타입을 추론할 수 있습니다.

즉, 변수를 초기화할 때 특정 타입을 명시하는 대신에, auto 키워드를 사용하여 초깃값에 맞춰 타입이 자동으로 선언되도록 설정할 수 있습니다.

 

기존의 auto 키워드는 자동 저장소 클래스에 있는 지역 변수를 선언하는 데 사용되는 기억 클래스 지정자였습니다.

하지만 사용하는 의미가 거의 없었기 때문에 기존의 auto 키워드는 거의 사용되지 않았습니다.

 

하지만 C++11부터는 auto 키워드의 의미를 재정의하여, 변수 선언 시 초깃값과 같은 타입으로 변수를 선언할 수 있도록 해줍니다.

즉, auto 키워드를 사용하면 복잡한 형식의 변수를 간단하게 선언할 수 있습니다.


연습문제