4. 문자 자료형
1. 키워드
- 문자 자료형
- 아스키(ASCII) 코드
2. 문자 자료형 사용하기
- C에서는 정수 자료형인
char
타입을 이용하여 문자 한 개를 저장한다.
- 다음은 문자 자료형의 크기와 저장할 수 있는 범위이다.
char
타입에 문자를 저장할 때는 문자 자체를 저장하는 것이 아니라 문자에 해당하는 정숫값을 저장하게 된다.- 다음은 각 정숫값이 어떤 문자에 해당되는지 표로 나타낸 것이며 이 규칙을 아스키(ASCII) 코드라고 부른다.
- C에서는 문자는
''
(작은따옴표)로 묶어서 표현한다.
''
는 문자 하나만 묶을 수 있으며 두 개 이상은 묶을 수 없다.
ASCII 코드
- ASCII 코드는
0
부터127
까지의 정수를 알파벳 대소문자, 특수 문자, 공백, 각종 제어 문자로 표현한다.
정수 자료형에 2바이트값 저장
''
는 문자 하나만 묶을 수 있지만, 정수 자료형에 2바이트값을 저장할 때는 문자 두 개를''
로 묶기도 한다.
3. 문자 변수 선언하기
- 다음 내용을 입력한 뒤 실행해 보자.
#include <stdio.h>
int main()
{
char c1 = 'a'; // 문자 변수를 선언하고 문자 a를 저장
char c2 = 'b'; // 문자 변수를 선언하고 문자 b를 저장
// char 타입을 %c로 출력하면 문자가 출력되고, %d로 출력하면 정숫값이 출력됨
printf("%c, %d\n", c1, c1); // a의 ASCII 코드값은 97
printf("%c, %d\n", c2, c2); // b의 ASCII 코드값은 98
return 0;
}
// a, 97
// b, 98
char
타입 변수에'a'
,'b'
와 같이''
로 문자를 묶어서 저장했다.printf
함수로char
타입 변수나 문자를 출력할 때는 서식 지정자로%c
를 사용한다.- 만약 서식 지정자로
%d
를 사용하여 출력하면char
타입 변수에 저장된 정숫값(ASCII 코드값)이 그대로 출력된다. - 여기서
'a'
와'b'
를 출력했으므로a
와b
문자가 그대로 출력되고,a
의 정숫값인 10진수97
,b
의 정숫값인 10진수98
이 출력된다.
''
로 문자를 넣지 않고 정수만으로 문자 자료형을 사용할 수도 있다.
#include <stdio.h>
int main()
{
char c1 = 97; // a의 ASCII 코드값 97 저장
char c2 = 98; // b의 ASCII 코드값 98 저장
// char 타입을 %c로 출력하면 문자가 출력되고, %d로 출력하면 정숫값이 출력됨
printf("%c, %d\n", c1, c1); // a, 97
printf("%c, %d\n", c2, c2); // b, 98
return 0;
}
- 변수
c1
,c2
에 정수 그대로 ASCII 코드값97
,98
을 넣었는데printf
함수에서%c
로 출력해 보면 알파벳 소문자a
,b
가 나온다. - 즉, 정수
97
과 문자'a'
는 같으며 어떤 서식 지정자를 사용해서 출력하느냐에 따라 다르게 보인다.
- 이번에는 ASCII 코드값 16진수를 넣어서 문자 자료형을 사용해 보자.
#include <stdio.h>
int main()
{
char c1 = 0x61; // a의 ASCII 코드값 0x61 저장
char c2 = 0x62; // b의 ASCII 코드값 0x62 저장
// char 타입을 %c로 출력하면 문자가 출력되고, %d로 출력하면 정숫값이 출력됨
// %x로 출력하면 16진수로 출력됨
printf("%c, %d, 0x%x\n", c1, c1, c1); // a, 97, 0x61
printf("%c, %d, 0x%x\n", c2, c2, c2); // b, 98, 0x62
return 0;
}
- 마찬가지로
printf
함수에서%c
로 출력해 보면 알파벳 소문자a
,b
가 출력된다. - 또한 ASCII 코드대로 10진수
97
,98
그리고 16진수0x61
,0x62
가 나온다. printf
함수에서 16진수를 출력하려면 서식 지정자로%x
를 사용한다.- 이때
%X
는 16진수의 알파벳을 대문자로 표시할 수도 있다. - 여기서
%x
로는 16진수의 숫자만 출력될 때 10진수와 구분하기가 힘들기 때문에 보통 서식 지정자 앞에0x
를 붙여서0x%x
와 같이 만든 뒤0x61
,0x62
형태로 출력한다.
- 문자 자료형에 같은 숫자를 저장한다 하더라도 문자
'0'
과 숫자0
은 전혀 다르므로 주의해야 한다.
#include <stdio.h>
int main()
{
char c1 = '0'; // 문자 0을 저장
char c2 = 0; // 숫자 0을 저장
// 문자 상태로 0이 출력됨
// 문자 0의 ASCII 코드값 48이 출력됨
printf("%c %d\n", c1, c1); // 0 48
// ASCII 코드값 0은 널 문자이므로 아무것도 출력되지 않음
// 정수 0이 출력됨
printf("%c %d\n", c2, c2); // 0
return 0;
}
char
타입 변수에''
로 감싼 숫자'0'
을 저장하면 숫자라 하더라도 문자 상태로 출력된다.- 따라서
printf
에서%c
로 출력하면0
이 출력된다. - 그리고
%d
로 출력해 보면 문자'0'
의 ASCII 코드값인48
이 나온다. - 여기서
char
타입 변수에 숫자0
을 그대로 넣었을 때는%c
로 출력해도 아무것도 출력되지 않는다. - 왜냐하면 ASCII 코드값
0
은 널 문자(NULL)를 뜻하며 아무 것도 들어있지 않은 상태이기 때문이다. - 즉,
printf
에서%d
로 출력했을 때'0'
은48
,0
은0
으로 출력되므로 전혀 다른 값이라는 것을 알 수 있다.
4. 문자로 연산하기
- 문자는 ASCII 코드 규칙에 의해 정수로 저장되므로 정수처럼 덧셈, 뺄셈 등을 할 수 있다.
#include <stdio.h>
int main()
{
// a는 ASCII 코드값 97이고
// 97에 1을 더하여 98이 되었으므로 b가 출력됨
printf("%c %d\n", 'a' + 1, 'a' + 1); // b 98
// ASCII 코드값 97에 1을 더하여 08이 되었으므로 b가 출력됨
printf("%c %d\n", 97 + 1, 97 + 1); // b 98
return 0;
}
'a' + 1
과 같이''
로 묶은 문자는 정수를 더하거나 뺄 수 있다.'a'
의 ASCII 코드값은97
이고,97
에1
을 더하면98
이다.- 따라서
98
에 해당하는 문자b
가 출력된다. - 만약
'a'
에2
를 더하면99
에 해당하는c
가 출력될 것이다. - 즉, 어떤 값으로 사칙연산을 하느냐에 상관없이 결괏값이
0
부터255
사이의 ASCII 코드 범위에만 있으면 된다.
- 물론
char
타입 변수에 정수를 더하거나 빼도 결과는 같다.
5. 제어 문자 사용하기
- 문자 자료형에는 숫자나 알파벳뿐만 아니라 제어 문자도 저장할 수 있다.
#include <stdio.h>
int main()
{
char c1 = 'a'; // 문자 a 할당
char c2 = 'b'; // 문자 b 할당
char lineFeed = '\n'; // 제어 문자 \n 할당
// 제어 문자도 %c로 출력할 수 있음
printf("%c%c%c", c1, lineFeed, c2, lineFeed);
return 0;
}
// a
// b
- 변수
lineFeed
에 제어 문자'\n'
을 넣은 뒤printf
에서%c
로 출력해 보면a
와b
사이에 줄바꿈이 되는 것을 볼 수 있다. - 즉,
''
로 제어 문자를 넣고printf
에서%c
로 출력하면 해당 제어 문자가 동작한다.
- 다음은 자주 접하는 제어 문자의 ASCII 코드이다.
- 수평 탭은 키보드의 탭키와 같다.
- 따라서
printf
에서'\t'
를 사용하면 일정 크기만큼 공간을 띄운다.
CR
, LF
의 유래
CR
,LF
는 타자기에서 나온 용어이다.- 타자기에서 줄바꿈을 하려면 종이를 오른쪽으로 쭉 밀고, 다시 종이를 한 줄 만큼 위로 올린다.
- 이렇게 종이를 오른쪽으로 밀어서 처음으로 오게 하는 행동을 복귀(Carriage Return)라고 하고, 종이를 위로 올리는 행동을 개행(Line Feed)이라고 한다.
- 보통 C에서는
printf
로 값을 출력할 때 운영체제와 상관없이\n
만 사용해도 된다.
- 이번에는 제어 문자의 ASCII 코드를 출력해 보자.
#include <stdio.h>
int main()
{
char lineFeed = '\n'; // 제어 문자 \n 할당
// 제어 문자의 ASCII 코드 출력
printf("%d 0x%x\n", lineFeed, lineFeed); // 10 0xa
return 0;
}
- 제어 문자라 하더라도
printf
에서%d
,%x
로 출력하면 변수에 들어있는 정수가 바로 출력된다. - 즉,
\n
은 ASCII 코드대로 10진수10
, 16진수0xa
가 나온다.