본문 바로가기
Programming/C++

상수와 기본 자료형

by OKOK 2017. 8. 4.

자신이 어떠한 언어를 좋아하건, 주로 사용하는 언어가 무엇이건, C라는 언어는 모든프로그래머의 공통 분모에 해당됩니다. 기본적으로 C 언어로 프로그래밍이 가능해야 JAVA로 프로그래밍을 하건, C++로 프로그래밍을 하건, 그 가치를 높일 수 있습니다. 


C언어가 제공하는 기본 자료형

변수라는 것은 데이터를 저장할 메모리 공간을 할당하고, 이에 이름을 붙여준 것이라고 이미 정의하였습니다. 예를 들어서 정수를 저장할 메모리 공간 4바이트를 할당하고 나서 그 메모리 공간에 val 이라는 붙여 준다면 val이 바로 변수가 되는 것입니다. C 언어는 이러한 변수의 선언을 위해 자료형이라는 것을 제공합니다. 자료형이란 선언할 변수이 특징을 나타내기 위한 키워드 입니다. 


기본 자료형 종류와 데이터의 표현 범위

long double 은 표현 가능한 데이터의 범위가 차이를 많이 보인다고 되어 있는데, 이는 상대적으로 시스템 및 컴파일러에 따라서 할당되는 메모리의 크기나 표현 가능한 데이터의 범위가 유동적인 자료형이기 때문입니다. 컴파일러마다 자료형의 바이트 수에는 차이가 조금 있습니다. 데이터의 표현 방식이 다르기 때문입니다. 메모리 공간을 적절히 사용하기 위해서 입니다. 


sizeof 연산자를 이용한 자료형 크기의 확인

sizeof 연산자는 단하 연산자로서 피연산자의 메모리 크기를 반환합니다. 피연산자로는 변수, 상수, 자료형의 이름 정도가 올 수 있습니다. sizeof 연산자의 피연산자로 자료형의 이름이 올 경우에는 괄호를 반드시 넣어줘야 하며, 그 이외의 경우 괄호는 선택적입니다. 


#include <stdio.h>


int main(void)

{

char c = 10;

int i = 3048;

double f = 3.1415;


printf("variable c : %d\n", sizeof c);

printf("variable i : %d\n", sizeof i);

printf("variable f : %d\n", sizeof f);


printf("char alloc memory: %d\n", sizeof(char));

printf("int alloc memory: %d\n", sizeof(int));

printf("float alloc memory: %d\n", sizeof(float));


printf("double alloc memeory: %d\n", sizeof(double));

printf("float alloc memory: %d\n", sizeof(float));


return 0;


미리 선언해 놓은 변수들에 할당된 메모리의 크기를 출력하고 있습니다. 기본 자료형이 요구하는 메모리의 크기를 출력하고 있습니다. 



자료형 선택하기

정수형 데이터를 처리하는 경우

#pragma warning(disable:4996)

#include <stdio.h>


int main(void)

{

char a, b;

char result;


printf("-50 ~ 50 two number input: ");

scanf_s("%d %d", &a, &b);

result = a + b;

printf("result: %d \n", result);


return 0;


메모리의 낭비가 발생하더라도 int형 변수를 사용합니다. 컴퓨터는 내부적으로 int형 데이터를 가장 빠르게 연산합니다. char형 변수는 문자를 표현하기에 적합한 자료형입니다.


실수형 데이터를 처리하는 경우

실수 자료형의 정밀도 자료형 float 정밀도 소수 이하 6자리, 자료형 double 정밀도 소수 이하 15자리, long double 정밀도 doble의 정밀도와 같거나 큽니다. 


#pragma warning(disable:4996)


#include <stdio.h>


int main(void)

{

double radius;

double area;


printf("circle radius input: ");

scanf_s("%lf", &radius);

area = radius*radius*3.1415;


printf("circle area: %f \n", area);


return 0;


각각 반지름의 길이를 입력받고 계산 결과를 저장할 double형 변수를 선언하고 있습니다. 실수형 데이터 연산을 하게 되는데 float형이 아닌 double형 변수르 선언하였습니다. 


unsigned가 붙으면 표현의 범위가 달라집니다.

기본 자료형 앞에 unsigned를 붙이는 경우 MSB까지도 데이터의 크기를 표현하는데 사용하게 되므로 데이터의 표현 범위가 양의 값으로 두 배가 됩니다. 기본 자료형 중에서도 정수형 자료형에만 붙일 수 있스니다. char, short, int 실수형 자료형에는 붙일 수 없습니다. 


문자를 이용한 데이터의 표현과 자료형

아스키코드의 등장 숫자를 가지고 문자를 표현하려면 숫자를 문자에 연결 시키는 수밖에 없습니다. 미국 표준 협회 American National Standards Insitutue에 의해 이뤄졌습니다. 


#pragma warning(disable:4996)


#include <stdio.h>


int main(void)

{

char ch1 = 'A';

char ch2 = 65;


printf("%d %d \n", ch1, ch2);

printf("%c %c \n", ch1, ch2);

return 0;


ch1 이라는 char형 변수에 문자 A를 대입하고 있습니다. 프로그램상에서 문자를 표현할 때는 반드시 따옴표로 감싸줘야 합니다. 숫자 65를 숫자 상수라고 표현하듯이, 따옴표로 감싸진 문자를 두고 문자 상수라고 합니다. 숫자 0부터 127이라는 범위는 char형 변수가 충분히 표현할 수 있는 범위입니다. 문자를 표현할 때는 int형 변수를 사용하지 않고 char형 변수를 사용하는 것입니다. 그래서 char형을 문자형이라 부르기도 합니다. 


상수에 대한 이해

상수는 크게 이름이 있는 상수와 이름이 없는 상수로 나눌 수 있으며, 자료형에 따라서도 나눌 수 있습니다. 우선 상수가 표현되는 방식은 다음과 같습니다. 


이름을 지니지 않는 상수 : 리터럴 상수

덧셈이라는 연산은 CPU에 의해서 진행이 되는데, CPU는 메인 메모리상(RAM)에 존재하는 데이터들만 조작(연산)할 수 있기 때문입니다. 할당된 메모리 공간에 이름이 없다는 것입니다. 이름이 없는 상수르 가리켜 리터럴 상수라고 합니다. C언어는 기본적으로 상수건 변수건 간에 자료형을 결정짓습니다. 그래야 적절히 메모리 공간을 할당하고 값을 저장할 수 있기 때문입니다. 대입 연산자의 오른쪽에 선언하고 있는 상수에 맞게 변수를 선언한 것 뿐입니다. 정수 상수는 언급했던 것처럼 기본적으로 int형으로 인식합니다. 그러나 상수의 값이 너무 커서 int형으로 인식하지 못하는 경우에는 long 형으로 인식합니다. 


#include <stdio.h>


int main(void)

{

float f = 3.14;

return 0;


상수 뒤에 f를 붙이게 되면, 이는 float형 상수로 인식하라는 의미가 됩니다. 


이름을 지니는 상수 : 심볼릭(Symbolic) 상수

심볼릭 상수를 표현하는 방법은 두 가지가 있습니다. 하나는 const 키워드를 이용하는 방식이고, 또 하나는 매크로를 이용하는 방식입니다. 변수를 선언만 하고 초기화해 주지 않으면 쓰레기값으로 초기화됩니다. 상수의 이름은 일반적으로 대문자로 표시합니다. 이렇게 함으로써 변수와 상수를 구분할 수 있게 됩니다. 


자료형 변환에 대한 이야기

자료형의 변환이라는 것은 int형 데이터가 float형으로 변환되거나, float형 데이터가 double형 데이터로 변환되는 등의 일을 말하는 것입니다.


자료 형 변환

대입 연산 시 발생하는 자동 형 변환 대입 연산 시에는 연산자의 왼쪽을 기준으로 자동 형 변환이 발생합니다. 따라서 대입 연산자의 오른쪽에 존재하는 데이터가 왼쪽에 존재하는 데이터의 자료형으로 자동 형 변환됩니다.


#include <stdio.h>


int main(void)

{

int n = 5.25;

double d = 3;

char c = 129;


printf("%d, %f, %d\n", n, d, c);


return 0;

 

소수부의 손실이라는 현상이 발생됩니다. 소수부의 손실이라는 현상은 실수형 데이터를 정수형 데이터로 변환하련느 과정에서 발생합니다. 값의 표현 범위가 넓은 데이터로의 형 변환은 아무런 문제가 발생하지 않습니다. 상위 비트의 손실이 발생합니다. 즉, 상위 3바이트를 단순히 버림으로 인해서 1바이트 데이터로 만드는 것입니다.


정수의 승격 : int형 연산이 빠른 이유

연산을 하기에 적절한 자료형으로 형 변환을 거친 다음 연산을 진행 하는 것을 가리켜 정수의 승격이라고 합니다. char형 데이터가 연산을 위해서 int형 데이터로 승격되었습니다. 이처럼 char, short와 같은 정수형 데이터 연산은, 일단 int형 데이터로 자동 형 변환 된 다음에 이뤄집니다. 이를 가리켜 정수의 승격이라고 합니다. 물론, int형 ㄷ이터들간 연산을 진행할 경우에는 형변환이 발생하지 않습니다. 이전에 필자가 다른 정수형 연산에 비해서 int형 연산이 빠르다고 하였는데, 형 변환 과정을 거치지 않기 때문에 빠른 것입니다. 


산술 연산 과정에서의 형 변환

산술 연산 과정에서 일어난 형 변환은 데이터의 손실이 최소화되는 방향으로 진행됩니다. 산술 연술 과정에서의 형 변환은 손실이 최소화되는 방향으로 발생한다고 하였습니다. 


강제 형 변환 (명시적 형 변환)

 

int main(void)

{

int a = 1;

int b = 2;


float f = a / b;

printf("divide result: %f\n", f);


return 0;


언제나 산술 연산결과의 자료형은 피 연산자의 자료형과 일치합니다. 즉 int형 데이터 두 개를 가지고 곱셈을 하건, 나눗셈을 하건, 그 결과 값은 항상 int형입니다.


#include <stdio.h>


int main(void)

{

int a = 1;

int b = 2;


float f = (float)a / b;

printf("divide result: %f\n", f);


return 0;


변수 a 앞에 괄호를 열고 float라는 자료형의 이름을 넣어 주고 있습니다. 이 과정에서 피연산자들 간의 자료형 통일 위해서 자동 형 변환도 발생합니다. 따라서 정수 2도 2.0으로 변환됩니다.