Programming/C

[C언어] 열형강의 C 프로그래밍 [5장 - 상수와 기본 자료형]

Fabric 2020. 6. 9. 23:12
반응형

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

 

C언어는 이러한 변수의 선언을 위해 자료형(data type)이라는 것을 제공한다. 여기서 말하는 자료형이란

"선언할 변수의 특징을 나타내기 위한 키워드"들이다.

 

int val;

 

여기서 int라는 자료형 선언은 생성하고자 하는 변수 val의 특징을 전달하기 위한 용도로 사용되었다.

이제 int형으로 선언된 변수 val은 4바이트 메모리 공간을 할당받아서 정수를 저장할 수 있게 되었다.

 

기본 자료형 - C 언어는 여러 가지 형태의 자료형을 기본적으로 제공하는데 이를 말함

 

자료형(data type)

할당되는 메모리 크기

정수형

char

1 바이트

short

2 바이트

int

4 바이트

long

4 바이트

실수형

float

4 바이트

double

8 바이트

long double

8 바이트 혹은 그 이상

 

왜 이리도 많은 수의 자료형을 제공하고 있는 것일까?

1. 데이터의 표현 방식이 다르기 때문이다.

   (자료형의 종류를 크게 두 가지(정수형, 실수형)로 나누고 있음을 볼 수 있다. 이렇게 자료형의 종류를 나눠 놓은 이유는 컴퓨터가

    내부적으로 처리하는 방식이 다르기 때문이다.

2. 메모리 공간을 적절히 사용하기 위해서다.

   (예를 들어서 3.14라는 실수를 메모리 공간에 담길 원한다. 이러한 경우 4 바이트 float형 변수만을 가지고도 충분히 표현이 가능한데,

    8바이트 double형 변수를 이용하게 되면 메모리 공간을 낭비하는 결과를 가져오게 된다.)

 

sizeof 연산자는 단항 연산자로서 피연산자의 메모리 크기를 반환한다.

 

printf("%d",sizeof val); // 변수 val의 메모리 크기 출력

printf("%d",sizeof(int)); // 자료형 int의 메모리 크기 출력

 

정수형 데이터 처리시

만일 char형 변수를 지정해 놓고, 그 변수가 저장할 수 있는 범위를 넘어서는 값을 입력할 경우에는 데이터 손실이 일어나게 된다.

여기서 데이터 손실은 데이터를 잃는다는 의미가 아니라, 데이터 원래의 값이 변경된다는 의미이다.

따라서 값이 감소하거나 증가하게 된다. 

 

컴퓨터는 내부적으로 int형 데이터를 가장 빠르게 연산한다.

따라서 정수형 데이터를 처리할 때는 보편적으로 int를 사용하는 것이 좋다.

(char은 컴퓨터에서 연산시에 int로 바꿔서 연산 후 다시 char로 바꿔서 출력해주므로 효율이 떨어진다.)

char형은 문자를 표현하기에 적합한 자료형이다.

 

실수형 데이터 처리시

보편적으로 double형 데이터를 많이 사용한다.

그 이유는 float형 보다는 정밀도가 높으면서도, long double형 보다는 부담이 덜 되기 때문이다.

정밀도 - "소수점 몇째 자리까지는 오차 없이 표현이 가능하다"라는 지표가 되는 것

(float의 정밀도는 소수 이하 6자리이고, double의 정밀도는 소수 이하 15자리이다.)

 

double형으로 데이터를 입력받는 경우에는 서식 문자 %f가 아니라 문자 l이 추가된 %lf를 사용해야 한다.

(주의. 만약에 %f를 사용해서 double형으로 데이터를 입력받는 경우 전혀 엉뚱한 값이 들어가게 된다.)

 

기본 자료형 앞에 unsigned를 붙이는 경우 MSB까지도 데이터의 크기를 표현하는데 사용하게 되므로 데이터의 표현 범위가 양의 값으로 두 배가 된다.

기본 자료형 중에서도 정수형 자료형(char, short, int...)에만 붙일 수 있다. 실수형 자료형에는 붙일 수 없음에 유의하자!

 

아스키코드(ASCII: American Standard Code for Information Interchange)

 

char ch1="A";

char ch2=65;

 

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

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

 

프로그램상에서 문자를 표현할 때는 반드시 따옴표(' ')로 감싸줘야 한다.

7번째 줄에서 대입하고 있는 숫자 65를 가리켜 숫자 상수라고 표현하듯이, 따옴표(' ')로 감싸진 문자를 두고 문자 상수라고 한다.

(%c는 문자로 출력하겠다는 것을 의미한다)

 

 

연습문제 5-1

문제 1

 

문제 2

 

문제 3

127

증가.1씩

소문자.20

 

문제 4

 

문제 5

 

 

5-2 상수에 대한 이해

 

리터럴(literal) 상수 - 이름이 없는 상수

 

char c = 'A'; // 문자 상수

int i = 5;       // 숫자 상수

double d = 3.15; // 실수 상수

 

C 언어는 기본적으로 상수건 변수건 간에 자료형을 결정짓는다.

 

float f = 3.14;

 

위의 코드를 컴파일하면 경고메시지가 뜬다.

(double형 상수를 4바이트짜리 float형 변수 f에 대입하다보면 데이터가 손실될 수도 있다는)

 

float f = 3.14f;

 

이번에는 경고메시지가 뜨지 않는다.

3.14가 float형 상수로 인식되었다는 뜻이 된다. 이렇게 상수 뒤에 f를 붙이게 되면 이는 float형 상수로 인식하라는 의미가 된다.

 

심볼릭(symbolic) 상수 - 이름을 지니는 함수

 

const라는 키워드를 사용하여 표현한다.

 

const int MAX=100;

const double PI=3.14;

 

심볼릭 상수도 일종의 상수이므로 한번 초기화되면 그 값을 변경할 수 없다. 뿐만 아니라 선언과 초기화를 분리시킬 수도 없다.

 

const int MAX;

MAX=100;

 

위와 같은 식으로 분리해서 표현할 수 없다.

 

상수의 이름은 일반적으로 대문자로 표시하는 것이 좋다. (보통 변수는 소문자로 표시하므로 구분하기 위해서)

 

 

5-3 자료형 변환에 대한 이야기

 

자료형의 변환 - int형 데이터가 float형으로 변환되거나, float형 데이터가 double형 데이터로 변환되는 등의 일들

 

자동 형 변환(묵시적 형 변환)

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

 

대입 연산 시에는 연산자의 왼쪽을 기준으로 자동 형 변환이 발생 한다.

 

int n=5.25;

double d=3;

char c=129;

 

첫번째 줄에서 int는 정수형 데이터인데 5.25라는 실수값을 주었으므로 왼쪽을 기준으로 정수화되어 5가 된다.

여기서 소수부가 손실되는 현상이 발생한다.

(실수형 데이터를 정수형 데이터로 변환할 때 생긴다)

 

char형 데이터가 int형으로 변환되거나, float형 데이터가 double형으로 변환되는 등

값의 표현 범위가 넓은 데이터로의 형 변환은 아무런 문제가 발생하지 않는다.

 

세번째 줄에서는 int형 데이터를 char형 데이터로 바꿈으로써 3바이트가 버려진다.

이것이 상위 비트의 손실이다.

c의 값은 -127로 나오게 되는데,

이처럼 정수형 데이터간의 형 변환에서는 상위 비트의 손실이 발생해서 예상치 못한 결과를 가져오기도 한다.

 

즉, 데이터 표현 범위가 보다 넓은 자료형으로의 형 변환은, 그 과정에서 데이터의 손실이 발생하지 않지만,

데이터 표현 범위가 보다 좁은 자료형으로의 형 변환은, 그 과정에서 데이터의 손실이 발생할 수 있다는 것이다.

 

double e1 = 5.5 + 7

double e2 = 3.14f + 5.25

 

첫번째 줄에서는 7이 double형 데이터로 변환된다.

두번째 줄에서는 3.14f가 double형 데이터로 변환된다.

 

이처럼 산술 연산 과정에서 일어나는 형 변환은 데이터의 손실이 최소화되는 방향으로 진행된다.

 

int a = 1;

int b = 2;

float f = a/b;

 

f값은 얼마가 출력이 될까?

답은 0.0000 이다.

언제나 산술 연산결과의 자료형은 피 연산자의 자료형과 일치하기 때문이다.

 

float f = (float)a/b;

 

세번째 줄을 이렇게 바꿔주면, a는 float형이 되고, b도 자동적으로 형변환 되어

0.5라는 값이 나오게 된다.

 

잘 모르겠다???

직접 해보면 된다!

 

 

이번 장에서 공부한 내용 정리

 

1. 기본 자료형의 종류와 특징에 대해서 살펴보았다.

2. 서식 문자 %lf에 대해서 언급하였다. 잊고 지내기 쉬운 내용이다.

3. 상수에 대해서 언급하였는데, 중요한 것은 상수도 메모리상에 저장된다는 것이다. 흔히 상수는 메모리상에 저장되지 않는 것으로 생각하는 경향이 있다. 이는 잘못된 것이다.

4. 자동 형 변환과 명시적 형 변환에 대해서 언급하였고 그 과정에서 int형 정수 연산이 빠른 이유도 언급하였다. 명시적 형 변환보다는 자동 형 변환이 더 중요한 내용이다.

반응형