02.08 - 문자 (char)
char 변수는 1-byte 정수(integer)다. 그러나 char 자료형이 정수 일지라도 일반 정수와는 다른 방식으로 사용한다. 그래서 char 값을 정수로 해석하는 대신 ASCII code 문자로 해석한다.
ASCII는 American Standard Code for Information Interchange의 약자로 영어 문자(+몇 개의 다른 기호)를 0에서 127 사이의 숫자(ASCII 코드)로 나타낸다. 예를 들어 'a' 문자는 코드 97이다. 'b'는 98이다. 문자는 항상 따옴표('') 사이에 배치된다.
ASCII 코드표:
Code |
Symbol |
Code |
Symbol |
Code |
Symbol |
Code |
Symbol |
0 |
NUL (null) |
32 |
(space) |
64 |
@ |
96 |
` |
1 |
SOH (start of header) |
33 |
! |
65 |
A |
97 |
a |
2 |
STX (start of text) |
34 |
” |
66 |
B |
98 |
b |
3 |
ETX (end of text) |
35 |
# |
67 |
C |
99 |
c |
4 |
EOT (end of transmission) |
36 |
$ |
68 |
D |
100 |
d |
5 |
ENQ (enquiry) |
37 |
% |
69 |
E |
101 |
e |
6 |
ACK (acknowledge) |
38 |
& |
70 |
F |
102 |
f |
7 |
BEL (bell) |
39 |
’ |
71 |
G |
103 |
g |
8 |
BS (backspace) |
40 |
( |
72 |
H |
104 |
h |
9 |
HT (horizontal tab) |
41 |
) |
73 |
I |
105 |
i |
10 |
LF (line feed/new line) |
42 |
* |
74 |
J |
106 |
j |
11 |
VT (vertical tab) |
43 |
+ |
75 |
K |
107 |
k |
12 |
FF (form feed / new page) |
44 |
, |
76 |
L |
108 |
l |
13 |
CR (carriage return) |
45 |
- |
77 |
M |
109 |
m |
14 |
SO (shift out) |
46 |
. |
78 |
N |
110 |
n |
15 |
SI (shift in) |
47 |
/ |
79 |
O |
111 |
o |
16 |
DLE (data link escape) |
48 |
0 |
80 |
P |
112 |
p |
17 |
DC1 (data control 1) |
49 |
1 |
81 |
Q |
113 |
q |
18 |
DC2 (data control 2) |
50 |
2 |
82 |
R |
114 |
r |
19 |
DC3 (data control 3) |
51 |
3 |
83 |
S |
115 |
s |
20 |
DC4 (data control 4) |
52 |
4 |
84 |
T |
116 |
t |
21 |
NAK (negative acknowledge) |
53 |
5 |
85 |
U |
117 |
u |
22 |
SYN (synchronous idle) |
54 |
6 |
86 |
V |
118 |
v |
23 |
ETB (end of transmission block) |
55 |
7 |
87 |
W |
119 |
w |
24 |
CAN (cancel) |
56 |
8 |
88 |
X |
120 |
x |
25 |
EM (end of medium) |
57 |
9 |
89 |
Y |
121 |
y |
26 |
SUB (substitute) |
58 |
: |
90 |
Z |
122 |
z |
27 |
ESC (escape) |
59 |
; |
91 |
[ |
123 |
{ |
28 |
FS (file separator) |
60 |
< |
92 |
\ |
124 |
\ |
|
29 |
GS (group separator) |
61 |
= |
93 |
] |
125 |
} |
30 |
RS (record separator) |
62 |
> |
94 |
^ |
126 |
~ |
31 |
US (unit separator) |
63 |
? |
95 |
_ |
127 |
DEL (delete) |
코드 0-31은 인쇄 불가능한 문자라고 하며, 대부분 포맷과 프린트 제어에 사용하다. 대부분 구식으로 잘 사용하지 않는다.
코드 32-127은 인쇄 가능한 문자라고 하며. 대부분 컴퓨터가 기본적인 영어 텍스트를 표시하는 데 사용하는 문자, 숫자 및 문장 부호를 나타낸다.
아래 코드는 모두 정수 값 97로 char를 초기화한다.
char ch1(97);
char ch2('a');
주의 사항: 문자와 실제 숫자를 혼동하면 안된다. 다음 초기화는 같지 않다.
char ch(5);
char ch('5');
문자 출력하기 (Printing chars)
std::cout
를 이용해서 char를 출력하면, char 변수를 정수 대신 ASCII code 문자로 출력한다.
#include <iostream>
int main()
{
char ch(97);
std::cout << ch;
return 0;
}
This outputs:
a
또한, 아래와 같이 문자 리터럴을 바로 출력할 수 있다.
std::cout << 'b';
This outputs:
b
형 변환을 통해 문자를 정수로 출력하기 (Printing chars as integers via type casting)
문자를 문자 대신 정수로 출력하려면 cout
에게 문자를 정수처럼 출력하도록 지시해야 한다. 이 작업을 수행하는 한 가지 방법은 char를 정수에 할당하고 정수를 출력하는 것이다.
#include <iostream>
int main()
{
char ch(97);
int i(ch);
std::cout << i;
return 0;
}
더 좋은 방법을 형 변환(type casting)을 하는 것이다. 형 변환은 다른 자료형의 값으로부터 특정 자료형의 값으로 만드는 것이다. 기본 자료형 간에 변환하려면 static_cast를 사용하면 된다.
static_cast 문법은 다음과 같다.
static_cast<new_type>(expression)
static_cast는 표현식(expression)의 값을 입력으로 사용하여 new_type이 나타내는 기본 자료형(ex. int, bool, char, double)으로 변환한다.
#include <iostream>
int main()
{
char ch(97);
std::cout << ch << std::endl;
std::cout << static_cast<int>(ch) << std::endl;
std::cout << ch << std::endl;
return 0;
}
This outputs:
a
97
a
입력으로 사용되는 표현식(expression)에 변수를 전달하면, 그 변수는 값을 생성하기 위해 평가되고, 새로운 자료형의 값으로 변환된다. 여기서 변수는 아무런 영향을 받지 않는다. (char 변수는 그대로 char 변수고, 여전히 같은 값을 가지고 있다.)
static_cast는 범위(range) 검사를 수행하지 않는다. 그러므로 char에 맞지 않게 너무 큰 정수를 지정하면 char가 오버플로(overflow) 된다.
아래 프로그램은 사용자의 문자를 입력받은 다음 문자와 ASCII 코드로 출력한다.
#include <iostream>
int main()
{
std::cout << "Input a keyboard character: ";
char ch;
std::cin >> ch;
std::cout << ch << " has ASCII code " << static_cast<int>(ch) << std::endl;
return 0;
}
Input a keyboard character: q
q has ASCII code 113
std::cin
은 여러 문자를 입력할 수 있지만, 변수 ch
는 1자만 입력할 수 있다. 사용자 입력 나머지 부분은 std::cin
이 사용하는 입력 버퍼에 남아 있으며, 이후 cin호출을 통해 접근 할 수 있다.
int main()
{
std::cout << "Input a keyboard character: ";
char ch;
std::cin >> ch;
std::cout << ch << " has ASCII code " << static_cast<int>(ch) << std::endl;
std::cin >> ch;
std::cout << ch << " has ASCII code " << static_cast<int>(ch) << std::endl;
return 0;
}
Input a keyboard character: abcd
a has ASCII code 97
b has ASCII code 98
char 자료형의 크기, 범위, 기본 기호 (Char size, range, and default sign)
C++ 에서 char
자료형은 1-byte로 정의된다. 기본적으로 char
자료형은 부호가 있으며(signed), ASCII 문자를 저장하는 경우 부호에 상관없이 0 ~ 127 사이의 값을 가지므로 부호를 지정할 필요가 없다.
char
를 사용하여 작은 정수를 저장하는 경우 항상 부호가 있는지 없는지 지정해야 한다. 부호가 있는 문자는-128과 127 사이의 숫자를 포함할 수 있고, 부호가 없는 문자는 0에서 255 사이의 숫자를 포함할 수 있다.
이스케이프 시퀀스 (Escape sequences)
C++에는 일부 특수한 의미가 있는 문자들이 있다. 이 문자들을 이스케이프 시퀀스(escape sequence)라고 한다. 이스케이프 시퀀스는 \(백 슬래시)
로 시작한 다음 문자 또는 숫자로 시작한다.
가장 흔한 이스케이프 시퀀스는 \n
으로 줄 바꿈을 하는 데 사용한다.
#include <iostream>
int main()
{
std::cout << "First line\nSecond line" << std::endl;
return 0;
}
This outputs:
First line
Second line
다음은 \t
로 tab이 내장된다.
#include <iostream>
int main()
{
std::cout << "First part\tSecond part";
return 0;
}
This outputs:
First part Second part
이스케이프 시퀀스(escape sequence)표:
Name |
Symbol |
Meaning |
Alert |
\a |
Makes an alert, such as a beep |
Backspace |
\b |
Moves the cursor back one space |
Formfeed |
\f |
Moves the cursor to next logical page |
Newline |
\n |
Moves cursor to next line |
Carriage return |
\r |
Moves cursor to beginning of line |
Horizontal tab |
\t |
Prints a horizontal tab |
Vertical tab |
\v |
Prints a vertical tab |
Single quote |
\’ |
Prints a single quote |
Double quote |
\” |
Prints a double quote |
Backslash |
\ |
Prints a backslash |
Question mark |
\? |
Prints a question mark |
Octal number |
(number) |
Translates into char represented by octal |
Hex number |
\x(number) |
Translates into char represented by hex number |
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/27-chars/ 입니다.