3-5.문자형
3-5-가.문자
문자형이란 문자 하나를 표현하는 자료형이다. 컴퓨터는 원래 숫자밖에 모르기 때문에 문자도 숫자로 기억한다. 이때 어떤 숫자와 어떤 문자를 대응시키는가에 따라 여러 가지 인코딩 방식이 있는데 통상 아스키(ASCII) 코드 방식을 많이 사용한다. 아스키 코드는 0~255사이의 숫자에 문자를 대응시켜 놓았는데 이 표를 보면 대문자 A는 문자 코드 65(0x41)로 표현하며 숫자 1은 49(0x31)로 표현한다.
10진 |
16진 |
문자 |
10진 |
16진 |
문자 |
10진 |
16진 |
문자 |
10진 |
16진 |
문자 |
10진 |
16진 |
문자 |
0 |
0 |
Null |
47 |
2F |
/ |
68 |
44 |
D |
89 |
59 |
Y |
110 |
6E |
n |
7 |
7 |
Bell |
48 |
30 |
0 |
69 |
45 |
E |
90 |
5A |
Z |
111 |
6F |
o |
8 |
8 |
BS |
49 |
31 |
1 |
70 |
46 |
F |
91 |
5B |
[ |
112 |
70 |
p |
9 |
9 |
Tab |
50 |
32 |
2 |
71 |
47 |
G |
92 |
5C |
|
113 |
71 |
q |
10 |
A |
LF |
51 |
33 |
3 |
72 |
48 |
H |
93 |
5D |
] |
114 |
72 |
r |
13 |
D |
CR |
52 |
34 |
4 |
73 |
49 |
I |
94 |
5E |
^ |
115 |
73 |
s |
32 |
20 |
공백 |
53 |
35 |
5 |
74 |
4A |
J |
95 |
5F |
_ |
116 |
74 |
t |
33 |
21 |
! |
54 |
36 |
6 |
75 |
4B |
K |
96 |
60 |
` |
117 |
75 |
u |
34 |
22 |
" |
55 |
37 |
7 |
76 |
4C |
L |
97 |
61 |
a |
118 |
76 |
v |
35 |
23 |
# |
56 |
38 |
8 |
77 |
4D |
M |
98 |
62 |
b |
119 |
77 |
w |
36 |
24 |
$ |
57 |
39 |
9 |
78 |
4E |
N |
99 |
63 |
c |
120 |
78 |
x |
37 |
25 |
% |
58 |
3A |
: |
79 |
4F |
O |
100 |
64 |
d |
121 |
79 |
y |
38 |
26 |
& |
59 |
3B |
; |
80 |
50 |
P |
101 |
65 |
e |
122 |
7A |
z |
39 |
27 |
' |
60 |
3C |
< |
81 |
51 |
Q |
102 |
66 |
f |
123 |
7B |
{ |
40 |
28 |
( |
61 |
3D |
= |
82 |
52 |
R |
103 |
67 |
g |
124 |
7C |
| |
41 |
29 |
) |
62 |
3E |
> |
83 |
53 |
S |
104 |
68 |
h |
125 |
7D |
} |
42 |
2A |
* |
63 |
3F |
? |
84 |
54 |
T |
105 |
69 |
i |
126 |
7E |
~ |
43 |
2B |
+ |
64 |
40 |
@ |
85 |
55 |
U |
106 |
6A |
j |
127 |
7F |
Del |
44 |
2C |
, |
65 |
41 |
A |
86 |
56 |
V |
107 |
6B |
k |
|
|
|
45 |
2D |
- |
66 |
42 |
B |
87 |
57 |
W |
108 |
6C |
l |
|
|
|
46 |
2E |
. |
67 |
43 |
C |
88 |
58 |
X |
109 |
6D |
m |
|
|
|
위 표가 아스키 코드인데 문자를 숫자로 바꿨습니다.
A는 아스키코드 값이 65이며 소문자 a는 97, 즉 대문자A와 소문자 a는 32라는 아스키 코드 차이를 보입니다.
255개의 서로 다른 문자를 기억하기 위해서는 단지 1 바이트만 있으면 된다. 문자형 타입은 char인데 정수형과 마찬가지로 char형도 앞에 수식어를 붙일 수 있다. 길이는 1바이트로 고정되어 있으므로 long이나 short같은 크기에 대한 수식어는 붙일 수 없고 부호의 여부에 따라 unsigned, signed 수식어만 붙일 수 있다. unsigned char형은 8비트 길이를 가지므로 0~255까지를 표현할 수 있고 signed char 형은 1바이트의 좁은 공간에도 음수 표현을 위해 MSB를 부호 비트로 사용하므로 최대 표현 수가 절반으로 줄어든다.
타입 |
크기(바이트) |
부호 |
범위 |
signed char |
1 |
있음 |
-128 ~ 127 |
unsigned char |
1 |
없음 |
0 ~ 255 |
부호 수식어없이 char라고만 쓰면 컴파일러와 설정 옵션에 따라 부호가 있을 수도 있고 없을 수도 있다. 대부분의 컴파일러들은 char형을 부호있는 타입으로 인식하므로 signed수식어는 생략할 수 있으며 signed char는 char 타입과 일단 동일하다. 컴파일러의 설정에 상관없이 부호 여부를 정확하게 지정하려면 signed, unsigned 수식어를 명시적으로 붙여야 한다. 문자 상수는 다음과 같이 표기한다.
'A', 'Z', '1', '&'
홑따옴표로 문자 하나를 감싸 주면 된다. 문자 상수는 아스키 코드값으로 해석되는데 'A'는 A문자의 아스키 코드값인 65와 같다. 다음 예제는 문자형 변수 ch를 선언하고 이 변수에 대문자 A를 대입한 후 출력해 본 것이다.
예 제 : char |
#include <Turboc.h>
void main()
{
char ch;
ch='A';
putch(ch);
}
ch 변수는 char형으로 선언되었으므로 문자 하나를 저장할 수 있는 1바이트가 할당될 것이다. 이 변수에 'A', 'B' 같은 문자형 상수를 대입할 수 있는데 예제에서는 'A'를 대입하여 ch 변수에 'A' 문자를 기억시켰다. 문자형 상수를 쓰는 대신 ch=65(또는 ch=0x41)와 같이 아스키 코드값을 직접 대입해도 결과는 동일하다. 하지만 누가 보더라도 ch=65; 보다는 ch='A'가 훨씬 더 읽기 쉽다.
문자형 변수를 출력할 때는 putch 함수를 사용한다. 또는 printf 함수의 %c 서식을 사용하여 printf("%c",ch); 로 출력할 수 있다. 예제를 실행해 보면 화면에 A 문자만 하나 출력될 것이다. 한글은 한 음절이 2바이트로 구성되기 때문에 문자형 변수에는 저장할 수 없으며 잠시 후에 배울 문자열을 사용해야 한다.
문자형은 문자 하나를 저장할 수 있는 적당한 길이를 가진다는 뜻으로 붙여진 이름이지 오로지 문자만 저장할 수 있다는 뜻은 아니다. char 타입은 실제로 8비트의 정수형이므로 크기가 작은 정수를 저장하는 용도로도 사용할 수 있다. 예를 들어 0~100까지의 범위를 가지는 점수라면 Score라는 이름으로 char형 변수를 선언한 후 여기에 저장하면 적당하다. 문자형이 일종의 정수형이라면 이 변수에 들어 있는 값은 과연 어떻게 해석될까? 다음 예제를 보자.
예 제 : charcontext |
#include <Turboc.h>
void main()
{
char ch='A';
printf("문자일 때 = %c, 정수일 때 = %dn,그리고 힘들어 죽겟다..",ch,ch);
gotoxy(ch,5);
putch(ch);
}
문자열 변수가 문자로 해석될 것인가 정수로 해석될 것인가는 이 변수가 사용되는 위치에 따라 달라지는데 문자가 올 수 있는 곳이면 문자로, 정수가 올 수 있는 곳이면 정수로 해석된다. printf 함수의 %c 서식과 대응되면 문자가 출력될 것이고 %d와 대응되면 정수값이 출력될 것이다. putch(ch)는 ch값을 문자로 해석하며 gotoxh(ch, 8)은 ch를 x 좌표를 나타내는 정수로 해석한다.