Skip to content

4. 문자 자료형


1. 키워드

  • 문자 자료형
  • 아스키(ASCII) 코드


2. 문자 자료형 사용하기

  • C에서는 정수 자료형인 char 타입을 이용하여 문자 한 개를 저장한다.


  • 다음은 문자 자료형의 크기와 저장할 수 있는 범위이다.


001


  • char 타입에 문자를 저장할 때는 문자 자체를 저장하는 것이 아니라 문자에 해당하는 정숫값을 저장하게 된다.
  • 다음은 각 정숫값이 어떤 문자에 해당되는지 표로 나타낸 것이며 이 규칙을 아스키(ASCII) 코드라고 부른다.


002


  • C에서는 문자는 ''(작은따옴표)로 묶어서 표현한다.


char c1 = 'a';


  • ''는 문자 하나만 묶을 수 있으며 두 개 이상은 묶을 수 없다.


char c1 = 'Hello, world!'; // 잘못된 사용법. 작은따옴표는 문자 하나만 묶을 수 있음


ASCII 코드

  • ASCII 코드는 0부터 127까지의 정수를 알파벳 대소문자, 특수 문자, 공백, 각종 제어 문자로 표현한다.


정수 자료형에 2바이트값 저장

  • ''는 문자 하나만 묶을 수 있지만, 정수 자료형에 2바이트값을 저장할 때는 문자 두 개를 ''로 묶기도 한다.


unsigned short magic = 'BA'; // 변수에 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'를 출력했으므로 ab 문자가 그대로 출력되고, 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, 00으로 출력되므로 전혀 다른 값이라는 것을 알 수 있다.


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이고, 971을 더하면 98이다.
  • 따라서 98에 해당하는 문자 b가 출력된다.
  • 만약 'a'2를 더하면 99에 해당하는 c가 출력될 것이다.
  • 즉, 어떤 값으로 사칙연산을 하느냐에 상관없이 결괏값이 0부터 255 사이의 ASCII 코드 범위에만 있으면 된다.


  • 물론 char 타입 변수에 정수를 더하거나 빼도 결과는 같다.


char c1 = 'a';

printf("%c %d\n", c1 + 1, c1 + 1); // b 98


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로 출력해 보면 ab 사이에 줄바꿈이 되는 것을 볼 수 있다.
  • 즉, ''로 제어 문자를 넣고 printf에서 %c로 출력하면 해당 제어 문자가 동작한다.


  • 다음은 자주 접하는 제어 문자의 ASCII 코드이다.


003


  • 수평 탭은 키보드의 탭키와 같다.
  • 따라서 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가 나온다.

References