CAFE

C 언어 일반

자료형

작성자창공|작성시간12.03.03|조회수323 목록 댓글 0

자료형은 정수형, 실수형, 문자형이 있으며 표현범위와 부호에 따라서 다시 세분화됩니다.


자료형(data type)에 대해서는 앞서 말씀드린 바 있지만 다시 한 번 정리해서 말씀드리겠습니다.

변수나 상수 함수를 선언하고 사용할 때 빼놓을 수 없는 개념이기 때문입니다.

C++언어의 자료형은 기본형과 파생형, 클래스형으로 나눕니다.

이 중에서 클래스형이라는 자료형은 이전의 C언어에서는 없었던 새로운 자료형입니다.

또한 파생형은 유도형이라고도 하는데 기본 자료형을 응용하여 만든 자료형으로 기본 자료형보다 성격이 좀더 복잡합니다.
기본형은 다시 크게 정수형과 실수형 문자형으로 나눌 수 있으며, 이는 다시 표현 범위에 따라서 short, long, double로 구분하고 이는 다시 음의 부호를 갖느냐 갖지 않느냐에 따라서 signed형이냐 unsigned 형이냐로 구분합니다.

각각의 키워드는 조합해서 사용할 수 있습니다.
이들 키워드는 다음과 같은 의미를 가지고 있습니다.

int= 정수형임을 나타냄
float= 실수형임을 나타냄
char= 문자형임을 나타냄
short= 기본 자료형보다 작은 수치를 표현할 때 사용
long= 기본 자료형보다 표현범위가 큰 자료형을 표현할 때 사용
double= 기본 자료형보다 두 배 이상의 자리수를 표현할 수 있는 자료형을 표현할 때 사용
unsigned= 음의 부호(- 기호)를 붙이지 않는 자료형에 사용. 음의 부호를 사용한다면 signed라고 써야 하겠지만 signed는 기본이므로 키워드로 사용하지 않음.


키워드를 조합하면 수 십 가지의 자료형이 만들어집니다.


이상의 키워드를 조합하면 다음과 같은 자료형을 선언할 수 있습니다.

int n1;
long n1;
unsigned int n1;
char c1;
unsigned char c1;

문자열은 배열에 속하지만 편의상 자료형으로 구분합니다.


그런데 C++에서는 이들 자료 형 외에도 몇 가지의 자료형을 더 제공합니다.

void형, 열거형입니다. 그리고 상수 중에 특이한 것으로 문자열 상수라는 것을 제공합니다. 엄밀하게 말하면 문자열은 자료형에 속하지 않습니다. 배열에 속하는 개념입니다.

그러나 여기서는 편의상 자료형의 하나로 다루겠습니다. 그러므로 볼랜드C++에서 제공하는 자료형은 문자열을 제외할 경우 크게 정수형, 실수형, 문자형, void형, 열거형, 부동형으로 나누며 이들을 키워드에 의해서 다시 수십 가지로 구분하는 겁니다.
그러나 문자형과 열거형은 성격상 정수형이나 마찬가지입니다. 때문에 어떻게 분류할 것이냐에 따라서 사람마다 기본형의 구분방법은 조금씩 다를 수 있습니다.

IBM PC에서는 2바이트(16비트)를 워드의 단위로 삼고 있습니다.


자료형을 좀더 공부하기 전에 C에서 자료를 다룰 때는 어느 정도의 크기를 기준으로 삼나를 알아봐야 합니다.

비트와 바이트에 대해서는 아실 것이므로 워드(word)에 대해서만 말씀드리겠습니다.

워드는 컴퓨터가 한꺼번에 처리할 수 있는 자료의 단위를 말합니다. 비트나 바이트의 크기는 모든 컴퓨터가 동일하지만 이 워드의 크기는 컴퓨터 기종에 따라서 조금씩 다릅니다. 보통 우리가 사용하는 IBM PC 호환기종에서는 2바이트(16비트)를 워드의 기본단위로 삼고 있습니다.

그러므로 특별한 말 없이 워드라고 말하면 2바이트 크기를 말하는 것으로 알아두시기 바랍니다.

**요약: C++언어의 자료형은 크게 정수형, 실수형, 문자형, 열거형, void형으로 나눌 수 있으며 이는 다시 표현 범위에 따라서 short, long, double로 구분하고 이는 다시 음의 부호를 갖느냐 갖지 않느냐에 따라서 signed형이냐 unsigned 형이냐로 구분합니다. 각각의

키워드는 조합해서 사용할 수 있습니다. 그리고 IBM PC에서 워드의 기본단위는 2바이트입니다.


A. 정수형(Integeral type)



정수형은 2바이트로 표현하므로 65536개의 숫자를 표시할 수 있습니다.


정수형은 정수를 표시하기 위해서 사용하는데 정수형으로 통해서 표현할 수 있는 범위는 보통 워드의 크기에 해당하는 크기입니다. 즉 16비트 크기인 65536 개의 숫자를 표현할 수 있습니다. 만약 부호가 있는 signed int 형이라면 -32768~32767까지의 숫자를 표현할 수 있고, 부호가 없는 unsigned int 형이라면 0~65535까지의 숫자를 표시할 수 있습니다.

이때 부호가 있나 없나는 최상위비트(MSB=Most Significant Bit)라는 것이 0이냐 1이냐로 판단합니다. 그러니까 16비트 중에서 첫번째 비트를 최상위비트라고 말하는데 이곳을 부호를 나타내는 비트로 사용하는 것입니다.

최상위비트가 1이면 signed 정수형으로 판단합니다.


만약 부호가 있는 signed 정수형이라면 MSB의 내용이 1일 때 부호가 있는 것으로 판단합니다.

첫번째 비트를 부호판단 비트로 사용하기 때문에 실제로 숫자를 표현할 수 있는 비트는 15비트밖에 남지 않습니다. 그렇기 때문에 2의 15제곱에 해당하는 수만을 표현할 수 있습니다. 즉 양의 부호일 때는 2의 15제곱으로 표현할 수 있는 0~32767까지만 표현할 수 있는 겁니다.

그러나 unsigned형으로 선언했다면 부호가 있는 최상위비트가 필요 없고, 최상위비트를 숫자를 표현하는데 사용할 수 있으므로 2의 16제곱인 0~65535까지의 수를 표현할 수 있습니다.

키워드 조합은 많지만 실제로 정수형은 4가지 종류의 자료형만 가집니다.


int형보다 작은 정수를 표현할 때는 short를 사용하고, int형보다 큰 정수를 표현할 때는 long이라는 키워드를 사용합니다.

그러나 C++에서 short와 int형은 사실상 같은 것입니다. 즉 int형과 short int형은 동일한 자료형입니다.

그리고 int라는 키워드는 short나 long라는 키워드를 붙이면 붙이지 않아도 됩니다. 그리고 기본적으로 int형은 signed형이므로 signed라는 키워드는 붙이나 마나입니다. 그래서 사실상 아래의 것들은 각기 다른 것처럼 보이지만 실제로는 같은 범위를 표현하는 것이므로 같은 표현이나 다름 없습니다.

1. int, signed, signed int, short int, signed short int


부호를 포함하고 있으므로 -32768~32767까지의 숫자를 표현할 수 있는 정수형 자료형입니다.


2. unsigned int, unsigned, unsigned short, unsigned short int


부호를 포함하지 않는 것이므로 0~65535까지의 숫자를 표현할 수 있는 정수형 자료형입니다.

3. long, long int, signed long int


이들은 정수형보다 두 배의 크기를 가지는 자료형을 표현할 수 있습니다. 32비트 크기로 자료를 표시하므로 4294967296 개의 자료를 표시할 수 있습니다. 부호가 있으므로 -2147483648 ~ 2147483647까지의 수를 표현할 수 있습니다.


4. unsigned long, unsigned long int


이들 자료형을 통해서 0 ~ 4294967295까지의 숫자를 표현할 수 있습니다.

위에서 본 것처럼 정수형의 종류는 키워드의 조합에 따라서 여러 가지로 표현할 수 있지만 사실상 4가지의 종류에 속하므로 C++에서 정수형은 int , unsigned, long ,unsigne long 등의 4 가지 종류만 있는 것으로 간주합니다.

이들 변수의 선언형식은 다음과 같습니다.

int n; // int 형으로 변수 n을 선언
unsigned n; // unsigned형으로 변수 n을 선언
long n; // long형으로 변수 n을 선언
unsigned long n; // unsigned long형으로 변수 n을 선언


정수형의 종류와 표현범위


이 름 표현범위
1. int형 -32768 ~ 32767
2. unsigned int형(=unsigned형) 0 ~ 65535
3. long형 -2147483648 ~ 2147483647
4. unsigned long형 0 ~ 4294967295


표: 정수형의 비교


┌───────┬───┬──┐
│종류 │크기 │부호│
├───────┬───┬──┤
│int │2 BYTE│있음│
├───────┼───┼──┤
│unsigned │2 BYTE│없음│
├───────┼───┼──┤
│long │4 BYTE│있음│
├───────┼───┼──┤
│unsigned long │4 BYTE│없음│
└───────┴───┴──┘

**요약: 정수형은 소수점이 없는 정수만을 다룰 수 있는 자료형입니다. 기본적으로 2바이트로 자료를 다루며 최상위 비트가 1이라면 signed 정수형으로 판단합니다.
정수형의 키워드 조합은 다양하지만 실제로는 int , unsigned, long ,unsigne long 등의 4 가지 종류 정수형만 있습니다.

B. 문자형(Character type)



문자형은 char형과 unsigned char형이 있으며 1바이트를 사용합니다.


문자형은 기본인 char형과 signed char, unsigned char형으로 나눌 수 있으나 char형과 signed char형이 사실상 같으므로 C++에서는 char형과 unsigned char형 두 종류만 있는 것으로 간주합니다. 문자형은 자료를 저장할 때 1바이트를 사용합니다.

1. char형


-128~127까지의 숫자를 표현할 수 있습니다. 문자를 나타내는데 웬 숫자냐고 생각하시는 분이 있을 겁니다. 어떻게 쓰더라도 컴퓨터는 이진수로 계산하므로 우리가 문자라고 생각하는 것도 컴퓨터는 모두 숫자로만 파악합니다. 정수형과의 차이점은 우리가 100이라는 숫자를 쓰면 화면에 십진수로 100을 표시하지만, 문자형은 100이라는 숫자에 해당하는 아스키코드 기호를 보여준다는 점이 다를 뿐입니다.

그렇다면 한 가지 의문이 생길 겁니다. 아스키코드는 0~255까지의 번호를 가지는데 양의 부호가 127까지 있으면 128~256까지의 아스키코드(이 부분은 확장문자열이라고 부릅니다.)는 화면에 보여주지 못하는가? 아닙니다. 아스키코드를 모두 보여줄 수 있습니다. 다만 128번 이후의 아스키코드를 음의 기호를 숫자로 표시한다는 것입니다.

그렇다면 실질적으로 char형을 쓸 필요가 없는 것 아니냐고 물어볼지 모릅니다. 음의 부호를 붙여서 아스키코드를 표현하는 일은 그냥 0~255까지의 숫자를 이용해서 붙이는 것보다 까다롭고 번거롭기 때문입니다. 결국 char형을 사용하는 이유는 음의 부호를 가진 기호를 사용해야 할 필요가 있기 때문이라고 말할 수 있습니다. 대표적인 것으로 EOF를 나타내는 문자의 표시에 char형을 사용합니다. -1의 복귀값을 보내주려면 char형을 사용해야 하는 겁니다.

2. unsigned char


이것은 0부터 255까지의 숫자를 사용하므로 아스키코드와 일대 일로 대응해서 사용합니다. 더 이상의 설명은 필요 없을 것으로 생각합니다.

표: 문자형의 종류와 표현범위


┌───────┬─────────────┐
│char │ -128~127 │
├───────┼─────────────┤
│unsigned char │ 0~255 │
└───────┴─────────────┘

**요약: 문자형은 0~255까지의 아스키코드표에 해당하는 문자를 다루는 자료형을 말하며 1바이트의 크기를 가집니다. C++에서는 char형과 unsigned char형 두 종류가 있는데 char형은 음의 부호를 붙일 수 있습니다.

C. 실수형(Floating type)
정수형과 달리 실수형은 소숫점 있는 숫자를 다루며 자료저장 단위로 32비트를 사용합니다.


실수형은 부동소수점형이라고도 하는데 실수(부동소수점)를 표현할 때 사용합니다. 정수형은 소숫점이 있는 수를 다룰 수 없지만 실수형은 소숫점이 있는 숫자를 다룰 수 있다는 말입니다. 실수형은 크게 3가지가 있는 것으로 간주합니다.

실수형은 정수형이나 문자형처럼 모든 비트를 숫자를 나타내기 위한 비트로만 사용하지 않습니다. 지수부분을 표시하는 비트와 가수부분을 표시하는 비트로 나눕니다. float형의 경우 32비트를 사용하므로 2의 32제곱까지 나타낼 수 있을 것으로 생각되지만 실제로는 이보다 더 큰 수를 표현할 수 있습니다. 2의 32제곱이므로 4294901760의 숫자를 다룰 수 있을 것으로 생각할 수 있지만 지수부와 가수부를 이용하므로 이보다 더 큰 숫자를 다룰 수 있습니다. 42억이 아니라 천 억이나 천 조의 단위도 다룰 수 있습니다.

실수형은 지수부와 가수부로 수를 표현하기 때문에 큰 수를 다룰 수 있습니다.


십진수로 예를 들어보겠습니다. 10 억이라는 숫자를 나타내기 위해서 일반적인 숫자표현법을 사용하면 다음과 같이 써야 합니다.

1000000000



열 자리의 십진수가 필요합니다. 그러나 이를 지수부와 가수부로 나누어서 표기하면 다음과 같이 줄일 수 있습니다.

109



10이라는 두 자리의 가수부와 한 자리의 지수부를 표현할 수 있습니다. 이는 곧 지수표기로 다음과 같이 표기합니다.

1.0e9


그러므로 가수부에는 1만 쓰면 되고, 지수부에 9라는 숫자를 써넣으면 천 억이 표시되는 겁니다.
다시 말해서 C에서는 오른쪽의 지수표현식으로 보기의 숫자를 저장한다는 이야기입니다.

110,000=1.2x105=1.2e5


356=3.56x102=3.56e2


0.00012=1.2x10-4=1.2e-4



C++언어에서 실수형 자료는 최대정밀도와 유효정밀도의 값이 다릅니다.


이런 이유로 C++언어에서 사용하는 실수형 자료는 최대정밀도 유효정밀도 출력정밀도라는 용어를 사용합니다. 실수형 자료를 이용한 계산결과는 믿을 수 없기 때문입니다. 지수표현식을 이용할 경우 365나 1234억과 같은 숫자를 사용할 때야 float형을 이용해서 넉넉하게 계산할 수 있지만 123,456,789.123456789123과 같은 숫자는 1234억보다 작은 수치임에도 불구하고 가수부에 숫자를 다 넣을 수 없기 때문입니다. 이로 인하여 가수부의 뒷 부분을 잘라내는 사태가 발생합니다. 그리고 이렇게 잘라낸 숫자를 가지고 계산을 하므로 계산결과를 신뢰할 수 없습니다.

그래서 최대 정밀도는 표현이 가능한 최대의 자리수를 말하지만, 유효정밀도는 어느 정도 믿을 수 있는 계산결과를 말합니다. 출력정밀도는 실제로 결과값을 표시할 때 표시할 수 있는 정밀도를 말하는데, 유효정밀도와 다른 까닭은 어떤 함수를 사용하느냐에 따라서 표현할 수 있는 자리수와 정밀도가 달라지기 때문입니다. 즉 printf() 함수를 이용해서 어떤 숫자를 표현하고자 할 때 printf() 함수를 통해서 표현할 수 있는 최대자리수가 정해져 있기 때문에 출력정밀도라는 말을 사용합니다.

실수형은 floadt, double, long double 세 종류가 있습니다.


이상의 내용을 바탕으로 실수형 자료의 종류를 나누면 아래와 같이 세 종류로 나눌 수 있습니다.

1. float


이것은 10의 -38제곱에서 38제곱까지의 숫자를 나타낼 수 있습니다.

2. double


10의 -308제곱에서 308제곱까지 나타낼 수 있습니다.

3. long double


10의 -4916제곱에서 4932제곱까지의 수를 나타낼 수 있습니다. 사실상 거의 사용하지 않습니다.

**요약: 실수형 자료는 소수점 이하의 작은 수나 매우 방대한 수를 다룰 수 있는 자료형으로 정수형을 확장한 자료형으로 볼 수 있습니다. 지수부와 가수르를 이용하기 때문에 매우 큰 수를 다룰 수 있으나 최대정밀도와 유효정밀도의 값이 다릅니다. 실수형은 float,

double, long double 세 종류가 있습니다.


D. 열거형 (Enumerated type)

키워드는 enum로 enumerated의 줄임말입니다. 이것은 정수(short int)와 같은 자료형으로 보시면 됩니다. 그러니까 -32768~32767까지의 수를 표현할 수 있습니다. 그러나 실제로는 둘 중의 하나를 선택하는 자료형에 많이 쓰입니다. 언젠가 배우게 되겠지만 불린형 함수 등에 많이 사용합니다.

E. void형


이상의 네 가지 자료형에 속하지 않는 자료형입니다. 그러므로 사실상 있으나마나 한 자료형이며 실체가 없는 자료형인 셈입니다. 자료형을 지정해주고 싶지 않을 때 사용하는 것으로 주로 함수에서 많이 사용합니다.

표: C++ 의 자료형 종류


- 기 본 형
- 정수형 : int, unsigned, long, unsigned long
- 문자형 : char , unsigned cahr
- 실수형 : float, double, long double
- 열거형 : enum
- void형
- 파 생 형
- 배열형(array type)
- 함수형(function type)
- 포인터형(fointer type)
- 구조체형(struct type)
- 공용체형(union type)
- 클 래 스 형
- 클래스형(class type)


F. 문자열 상수와 문자 배열 상수
C++언어에서 문자열은 문자를 배열에 집어넣은 문자배열 상수를 이용해 표현합니다.


문자열이란 쉽게 말해서 여러 개의 문자들이 나열된 문장을 말합니다. 그러니까, a나 b라는 한 글자는 문자형이고, "I am a boy."라는 문장은 문자열입니다. 그런데 이상하게도 C는 자료형 중에 문자열형이 없습니다. 그러면 어떻게 문자열을 표현할 수 있는가? 문자열 상수를 통해서 표현합니다. 여기에서 한 가지 의문을 가질 수 있을 겁니다. 자료형 중에 문자열형이 없는데 상수의 자료형에 어떻게 문자열 상수가 존재할 수 있는가입니다. 정수형이라는 자료형이 없는데 정수형 변수나 정수형 상수를 쓰겠다면 말이 안된다고 하실 겁니다.
맞습니다. 실제로 C와 C++에는 문자열 상수라는 것이 존재하지 않습니다. 정확하게 말하면 문자들을 배열에 집어넣은 문자배열 상수가 존재하는 겁니다. 그러니까, 문자형 자료를 이용해서 각각의 문자를 배열에 줄줄이 집어넣습니다. 그리고 이 문자배열을 가지고 문자열을 다루는 것입니다. 그러나 보통은 이 문자배열 상수를 문자열 상수라고 부릅니다.

C++언어에서의 문자열 상수는 일차원 문자배열 상수입니다.


C는 문자열 상수가 일차원 문자 배열과 거의 비슷합니다. 좀더 정확하게 말하면 널문자 '\0'으로 끝나는 일차원 문자 배열 상수를 문자열 상수라고 말합니다. 이 문자열 상수를 다룰 때는 큰 따옴표("")로 묶어줍니다. 즉 "I am a boy."라는 문장은 I am a boy.라는 문자열 상수를 대신할 수 있는 겁니다. 이때 "I am a boy."는 문자열 상수임을 알려주는 큰 따옴표를 빼고 널문자를 추가하여 배열에 저장됩니다.

보기


"I am a boy."의 저장형태


I

a
m

a

b
o
y
.
\0


C++언어에서는 널문자인 \0이 문장의 끝을 나타내는 기호로 사용됩니다.

배열에 관해서는 앞서 간단하게 언급했습니다. 여러 개의 변수를 한 이름으로 사용할 수 있는 변수묶음으로 보면 된다고 말씀드렸습니다. 위의 문장을 보면 모두 12개의 크기를 가지는 배열입니다. 만약 이를 문자형 변수나 문자상수로 표현하고자 한다면 12개의 문자형 변수가 필요하거나 12개의 문자상수를 붙여서 사용해야 합니다. 그러나 배열이기 때문에 하나의 배열로 한 문장을 나타낼 수 있습니다.

위의 문자열 저장형태를 보면 12칸임을 알 수 있는데 빈 칸도 하나의 글자로 인식한다는 점은 이해하실 것으로 생각합니다. 한 가지 이상한 점은 \0이라는 글자입니다. boy 다음의 마침표(.)까지가 한 문장이 아닌가 하고 생각하는 분이 많을 것으로 압니다. 맞습니다. 일반적인 문장에서는 마침표까지만 하나의 문장입니다. 그러나 C++언어에서는 \0이라는 특수한 문자를 사용합니다. 이 문자는 널(Null)문자라고 하는데 문장의 끝임을 나타내는 기호로 사용하고 있습니다.

컴퓨터는 사람과 달리 어디까지가 문장의 시작이고 어디까지가 한 문장의 끝인지를 판별할 수 없습니다. 그래서 시작과 문장의 끝을 알 수 있는 기호가 필요합니다. 문장의 시작은 배열의 시작으로 생각하면 됩니다. 그러나 문장의 끝은 어디쯤인지 알 수 없기 때문에 \0이라는 널문자를 붙여서 문장의 끝을 알려주는 겁니다. 만약 배열의 크기가 10개라고 하고 여기에 10개의 문자를 저장할 수 있다고 합시다. 그런데 문장은 "I am"이라는 문장이 전부라고 합시다. 이럴 경우 아래와 같이 표현하면 컴퓨터는 마지막까지 빈 칸으로 꽉 찬 문장으로 인식합니다.

V class="gangjo1"> I

a
m

사람은 "I am a boy. And you? A ha!"라는 문장을 보고 3 개의 문장으로 구별합니다. 그러나 컴퓨터에서는 마침표나 물음표나 하나의 아스키코드로만 볼 뿐입니다. 다른 문자와 같이 똑 같은 하나의 문자로 볼 뿐입니다. 그래서 이들 문장을 하나의 문장이 아닌 세 개의 문장으로 구별해주기 위해서는 널문자를 넣어주어야 하는 겁니다. 널문자를 끝에 넣어주는 일은 C프로그램이 자동으로 해줍니다. 우리는 "I am"이라고 치지만 C는 아래와 같이 자료를 저장하는 겁니다.

V class="gangjo1"> I

a
m
\0

**요약: C++언어에서 문자열은 문자를 배열에 집어넣은 문자배열 상수를 이용해 표현합니다. 즉 문자열상수라는 것은 사실상 문자 배열 상수의 다른 모습입니다. 문자열을 저장할 때는 문장 끝임을 알리는 널문자(\0)을 넣어서 저장합니다.


G. 자료형의 변환에 대하여
자료형을 변환하여 계산해야 할 때 형변환을 이용합니다.

이상의 내용을 통해 C++언어에서 사용하는 자료형에 대해서 좀더 자세하게 배웠습니다. 변수나 상수는 각각의 자료형에 맞게 사용해야 한다는 점은 물론입니다. 정수형에 100만이라는 수를 넣어도 안되고 3.14라는 소수점을 넣어도 안됩니다. 그런데 프로그램을 만들다보면 정수형으로 선언한 변수를 잠시 실수형으로 변환해서 계산을 해야할 때가 생깁니다. 이럴 경우에는 자료형을 바꾸어야 하는데 자료형을 바꾸는 것을 형변환이라고 합니다. 형변환은 자동적으로 이루어지기도 하고 강제로 하기도 합니다.

형변환은 자동으로 이루어지기도 하고 자동형변환이 안될 때도 있습니다.

printf() 함수를 사용할 때는 형변환이 자동으로 이루어집니다. 아래의 보기를 실행시켜 보면 알 수 있습니다.

// test020.cpp
// 자료형을 형변환 하여 출력하는 예제

#include

void main(void)
{
printf(" result=%c\n",'A'); // 문자형 자료 A를 문자형으로 출력
printf(" result=%d\n",'A'); // 문자형 자료 A를 정수형으로 출력
printf(" result=%f\n",'A'); // 문자형 자료 A를 실수형으로 출력
printf(" result=%c\n",70); // 정수형 자료 70을 문자형으로 출력
printf(" result=%d\n",70); // 정수형 자료 70을 정수형으로 출력
printf(" result=%f\n",70); // 정수형 자료 70을 실수형으로 출력
printf(" result=%c\n",70.0); // 실수형 자료 70.0을 문자형으로 출력
printf(" result=%d\n",70.0); // 실수형 자료 70.0을 정수형으로 출력
printf(" result=%f\n",70.0); // 실수형 자료 70.0을 실수형으로 출력
}


**그림: test020.cpp의 소스파일 내용

위의 프로그램을 만들어 실행시키면 아래와 같은 결과가 나옵니다.

result=A
result=65
result=0.000000
result=F
result=70
result=0.000000
result=
result=0
result=70.000000

**그림: test020.exe를 실행시켰을 때의 화면

위의 보기 프로그램을 한 줄 씩 살펴보겠습니다.
printf(" result=%c\n",'A');


결과
result=A

%c라는 기호에 문자형 상수인 'A'글자를 치환(대입)해서 화면에 보여주라는 명령문입니다. 이 경우 %c는 문자형을 표시할 수 있는 형변환기호이므로 그대로 A자로 치환해서 바꾸어줍니다.

printf(" result=%d\n",'A');


결과
result=65

역시 문자형 상수 'A'를 화면에 보여주는데 이번에는 형 변환 기호가 %d입니다. 이 기호는 정수형으로 치환하라는 기호입니다. 그래서 A자의 아스키코드에 해당하는 숫자인 65를 보여준 것입니다. 이를 통해서 문자형 상수는 정수형으로 화면에 출력할 때는 자동변환이 된다는 사실을 알 수 있습니다.

printf(" result=%f\n",'A');


결과
result=0.000000

문자 A를 실수형 자료로 출력하라고 하자 0이 나왔습니다. 문자형 상수를 실수형으로 자동형변환 해주지 않는다는 사실을 이 명령문의 결과로 알 수 있습니다.

printf(" result=%c\n",70);

printf(" result=%d\n",70);

printf(" result=%f\n",70);


결과
result=F
result=70
result=0.000000

다음의 세 문장은 정수형 상수 70이라는 수를 각각 문자형과 정수형, 실수형으로 출력하라는 명령문입니다. 그 결과 정수형 상수 70을 문자형으로 자동형변환하여 아스키코드 70번에 해당하는 F자를 출력했습니다. 그러나 실수형으로는 형변환되지 않았습니다.
따라서 숫자라고 하여 정수나 실수 어떻게 사용해도 결과는 같겠지 하는 자세는 버려야 합니다. 사람들은 정수 70과 실수 70을 같은 수로 알고 계산하지만 컴퓨터는 정수 70을 실수 70으로 변환하지 못합니다. 이런 차이점을 모르고 프로그램을 짰다가는 전혀 엉뚱한 결과를 얻게됩니다.

printf(" result=%c\n",70.0);

printf(" result=%d\n",70.0);

printf(" result=%f\n",70.0);


결과
result=
result=0
result=70.000000

마지막 세 문장을 통해서는 실수형 상수를 정수형이나 문자형으로 자동형변환하지 않는다는 것을 알 수 있습니다. 실수형 자료를 정수형 변수에 넣어서 계산할 경우 원하지 않는 결과가 나온다는 사실을 지금의 예제를 통해서 알았습니다. 따라서 자신이 사용하는 변수와 상수의 정확한 자료형을 기억하면서 프로그램을 짜나가야 합니다.

자동형변환이 안될 경우에는 사용자가 강제로 형변환을 시켜주어야 합니다.

프로그램을 짤 때는 이런 자동형변환이 되는 것과 되지 않는 관계를 잘 파악해두었다가 활용해야 합니다. 형변환은 printf() 함수에서만 되는 것이 아니고 여러 함수와 연산에서 자동으로 이루어집니다. 예를 들어서 정수와 실수를 곱하면 그 결과값은 자동적으로 실수로 변환됩니다. 따라서 그 결과값을 C라는 변수에 넣을 경우 C는 실수형 변수여야 합니다. 만약 C가 실수형 변수가 아니라면 잠시 실수형으로 강제 형변환을 해주어야 합니다.

표: 형 변환 기호

기호
인수의 수형
변환 내용
%d
%u
%ld
%lu
%o
%x
%X
%c
%s
%f
%e
%E
%g
%G
정 수 형
정 수 형
배정도 정수형
배정도 정수형
정 수 형
정 수 형
정 수 형
문자
문자열 포인터
실수형
실수형
실수형
실수형
실수형
인수를 부호있는 10진수로 출력한다
인수를 부호없는 10진수로 출력한다
인수를 부호있는 배정도(long) 정수로 출력한다
인수를 부호없는 배정도(long) 정수로 출력한다
인수를 부호없는 8진수로 출력한다
인수를 부호없는 16진수로 출력하는데 소문자로 출력한다
인수를 부호없는 16진수로 출력하는데 대문자로 출력한다
인수를 단일문자로 출력
널문자(\0) 앞까지의 문자열을 출력한다
고정 소숫점 형식으로 출력한다
부동 소숫점 형식으로 출력한다
부동 소숫점 형식으로 출력한다
%f와 %e 의 표현방식 중에서 간단한 형식을 택해 출력한다
%f와 %e 의 표현방식 중에서 간단한 형식을 택해 출력한다


형변환기호는 printf() 함수에서 많이 사용합니다. 이미 예제로 몇 번 설명을 드렸지만 표로 정리한 내용을 참고하여 정확하게 알아두시기 바랍니다.

자료의 형명을 바꿀 때는 typedef 명령어를 사용합니다.

그리고 가끔은 자료의 형명, 즉 키워드를 바꾸어야 할 때가 있습니다. 먼저 자료의 형 이름을 바꾸고자 한다면 다음과 같은 형식을 사용합니다.

typedef 기존자료형 이름 새로운 이름


기존 자료형 이름이 char, int, long 등일 때, 새로운 자료형 이름은 사용자가 정해서 붙이는 이름인 셈입니다.

typedef int kimint;

int money;

kimint kmoney;


위와 같이 하면 kimint가 int라는 자료형을 나타내는 키워드가 됩니다. 물론 이전에 사용하던 int라는 것도 유효합니다. 따라서 'typedef int kimint;' 명령어를 쓴 뒤에는 'int money;' 라고 기존의 방식대로 정수형 변수 money를 선언하는 것도 가능하고, 'kimint kmoney;'와 같이 kimint라는 형명을 이용하여 정수형 변수 kmoney를 선언하는 것도 가능합니다.

형변환이 자동으로 이루어질 때는 작은 쪽에서 큰 쪽으로 변합니다.

형변환이 자동으로 이루어질 때는 보통 작은 쪽에서 큰 쪽으로 변합니다. 물론 이 말은 절대적이지 않습니다. 그러나 대부분의 경우 문자와 정수를 더하면 정수형으로 결과값이 나오고 정수와 실수를 함께 계산하면 실수형으로 결과값이 나옵니다.

예를 들어서 아래의 경우를 보시기 바랍니다.

'A' + 10 = 75

char + int = int


문자형 상수 A와 정수형 상수 10을 더하면 정수형상수로 값이 나옵니다. 즉 문자형과 정수형을 함께 연산하면 정수형으로 결과값이 나옵니다. 형변환은 정수형으로 변하는 것입니다.

'A' + 10 + 3.3 = 78.3

char + int + double = double


이번에는 문자형과 정수형, 실수형을 한꺼번에 더해봤습니다. 결과값은 실수형으로 나옵니다. 이처럼 보통 형변환은 작은 쪽에서 큰 쪽으로 변합니다. 그러니까 정수와 실수를 연산하면 실수형으로 형변환이 이루어진다는 이야기입니다.

강제로 형변환을 할 때는 캐스트연산자를 사용합니다.

강제로 형변환을 할 때는 캐스트연산자라는 것을 사용합니다. 캐스트연산자는 둥근괄호를 기호로 사용합니다.

'A' + (int)2.5 = 67

char + int = int


위의 보기는 2.5라는 실수형 자료를 잠시 int형으로 바꾸어서 계산한 것입니다. 그래서 결과값도 int형이 된 겁니다.

(int)(3.14 + 3.14)=6

(int + int) = int


만약 위의 보기를 그대로 연산했다면 다음과 같은 결과가 나왔을 겁니다.

3.14 + 3.14 = 6.28
float + float = float

**요약: 각기 다른 형태의 자료를 이용해서 연산할 때는 자동 형변환에 유의해야 합니다. 자동변환이 자동으로 이루어질 때는 보통 큰 쪽으로 변환이 이루어집니다. 즉 문자형 정수형 실수형의 순서로 변환이 이루어집니다. 필요할 경우에는 캐스트연산자를 이용하
여 강제로 자료형을 바꿀 수 있습니다.

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼