소년코딩

02.08 - 문자 (char)

char 변수는 1-byte 정수(integer)다. 그러나 char 자료형이 정수 일지라도 일반 정수와는 다른 방식으로 사용한다. 그래서 char 값을 정수로 해석하는 대신 ASCII code 문자로 해석한다.

ASCIIAmerican 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);  // initialize with integer 97
char ch2('a'); // initialize with ASCII code for 'a' (97)
주의 사항: 문자와 실제 숫자를 혼동하면 안된다. 다음 초기화는 같지 않다.
char ch(5);   // initialize with integer 5
char ch('5'); // initialize with ASCII code for '5' (53)

문자 출력하기 (Printing chars)

std::cout를 이용해서 char를 출력하면, char 변수를 정수 대신 ASCII code 문자로 출력한다.

#include <iostream>

int main()
{
    char ch(97); // even though we're initializing ch with an integer
    std::cout << ch; // cout prints a character
    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); // assign the value of ch to an integer
    std::cout << i; // print the integer value
    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) 된다.


문자 입력하기 (Inputting chars)

아래 프로그램은 사용자의 문자를 입력받은 다음 문자와 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: "; // assume the user enters "abcd" (without quotes)

    char ch;
    std::cin >> ch; // ch = 'a', "bcd" is left queued.
    std::cout << ch << " has ASCII code " << static_cast<int>(ch) << std::endl;

    // Note: The following cin doesn't ask the user for input, it grabs queued input!
    std::cin >> ch; // ch = 'b', "cd" is left queued.
    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

cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/27-chars/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기