본문 바로가기
c언어

c언어 문자형과 아스키코드 알아보기(char)

by 개발자 L 2022. 11. 27.
반응형

c언어 문자형과 아스키코드 알아보기(char)

네 안녕하세요, 이번 포스팅에서는 c언어에서의 문자형에 대하여 알아보는 시간을 가져보려 합니다.

문자는 말 그대로 우리가 직접 써서 표현하는 모든 것들을 문자라고 헙니다.

그리고 이러한 문자는 컴퓨터에게는 사실 그다지 중요한 요소로 인식이 되지는 않지만, 사람에게는 아주 중요합니다.

일단 컴퓨터를 이용하는 이용자가 사람이고, 사람은 문자를 통해서 정보를 얻기 때문에 문자가 없으면 안 됩니다.

그러면 컴퓨터 내에서는 문자를 어떤 식으로 표현할까요?

지금부터 같이 한 번 알아볼까요?

 

1. 문자와 아스키코드

일단 컴퓨터는 사람과는 다르기 때문에 문자가 무엇인지 모릅니다.

그래서 사람들은 컴퓨터가 문자를 인식할 수 있도록 하는 어떤 표준 규격이 필요했는데요,

그게 바로 우리가 흔히 이야기하는 아스키코드입니다.

아스키코드는 영어를 기반으로 하는 문자 엔코딩 방법입니다.

그리고 아스키 코드는 0에서 127까지, 다시 말해 128개의 번호만을 사용하기 때문에 7비트만 있으면 모든 것이 표현이 가능합니다.

하지만 c언어에서 문자형 자료형을 지정하는 자료형인 char형은 8비트이기 때문에 이걸 다 쓰고도 절반이나 공간이 남습니다.

그래서 그 외 빈 공간들은 그래픽 문자들과 같은 특수문자들과 유럽권에서 쓰는 라틴어 등에 쓰이는 특수 기호들이 그 빈자리를 차지합니다.

그리고 보통 아스키코드를 쓸 때는 이런 식으로 많이 씁니다.

char code;

code = 65;

이렇게 쓰게 되면 아스키코드를 받겠다고 선언했으며, 사용하는 아스키 코드의 번호는 65번이 된다는 의미가 됩니다.

하지만 이렇게 아스키 코드를 쓰는 건 사실 요즘은 잘 쓰지 않습니다.

코드 번호를 다 외워서 쓴다는 것이 결코 쉬운 일도 아닐뿐더러, 본인이 정보 보안 계열에서 해킹이나 복호화, 또는 암호화를 하는 일을 하지 않는 이상은 아스키코드를 적극적으로 쓸 일이 없기 때문입니다.

그래서 실제로는 이런 식으로 많이들 씁니다.

char code;
code = 'A'

아스키 코드를 쓸 일이 있다 한들, 이렇게 직접 문자를 넣어서 씁니다.

이렇게 해도 이 문자 그대로 인식이 되기 때문입니다.

그리고 이렇게 char형으로 받을 때의 규칙이 있는데, 문자를 이렇게 작은따옴표('')로 감쌌죠?

이렇게 하게 되면 문자를 상수화 시키는 겁니다.

그래서 이렇게 작은 따옴표 안에 싸여있는 문자를 문자 상수라고 부릅니다.

그리고 굳이 아스키코드를 쓰지 않아도 문자 선언은 가능합니다.

간단한 예제를 통해서 보여드리도록 하겠습니다.

#include <stdio.h>

int main()

{
	char c1 = 'a';
	char c2 = 'b';
    
	printf("%c\n", c1);
	printf("%c\n", c2);
    
	return 0;
}

이런 식으로 문자 변수를 선언을 해서 직접 씁니다.

본인이 정보 보안 계열로 전공을 택해서 취직을 할 게 아니라면 말이죠.

이렇게 하면 결과는 이런 식으로 나옵니다.

a
b

그냥 이렇게 바로 문자를 출력할 수 있습니다.

어때요? 정말 간단하죠?

그래도 일단 아스키코드에 대한 설명을 드렸으니, 아스키코드를 이어서 한 번 다뤄보도록 하겠습니다.

위의 설명을 토대로 한 번 간단하게 예제 코드를 작성해보도록 하겠습니다.

#include <stdio.h>

int main()

{
  char code1 = 'A'; // 문자 상수로 초기화
  char code2 = 65; // 아스키 코드로 초기화
  
  printf("code1 = %c\n", code1);
  printf("code2 = %c\n", code2);

  return 0;
}

이렇게 각각 문자 상수로 초기화를 시킨 경우와 직접 아스키 코드 번호를 쳐서 나타낸 경우를 한 번 예를 들어봤습니다.

대문자 A의 코드 번호는 65번입니다.

그래서 문자 상수 A를 상징하는 번호인 65를 두 번째 선언에다가 넣었습니다.

그럼 한 번 결과를 같이 볼까요?

code1 = A
code2 = A

이렇게 값이 똑같이 나오는 것을 보실 수 있습니다.

그래서 아스키 코드를 입력을 할 때 굳이 숫자로 입력을 할 필요가 없다고 하는 것입니다.

반응형

 

2. 제어 문자

아스키코드에서는 입력 문자 외에 제어 문자들도 같이 정의가 되어있습니다.

우리가 순수하게 입력만 하다 보면 예상치 못한 오류를 컴퓨터가 범할 때가 생길 수 있습니다.

그래서 그러한 것들을 방지하기 위해 제어 문자를 사용합니다.

이런 제어 문자를 사용하기 위해서 우리는 직접 그 제어 문자의 아스키코드값을 직접 입력을 합니다.

하지만 이건 제일 간단한 방법이긴 하지만, 번호를 외우고 있어야 하기 때문에 너무나도 번거롭습니다.

이러한 에러 사항 때문에 또 다른 방법을 고안을 했습니다.

바로 특수 문자열을 이용하는 방법입니다.

우리가 지금까지 사용했던 \n이 바로 특수 문자열을 이용하여 표현하는 방법이었습니다.

이 문자의 뜻은 줄 바꿈 문자, 다시 말해서 개행을 하는 문자입니다.

이런 식으로 백 슬래시(\)를 사용해서 나타내서 제어를 합니다.

백 슬래시는 원화 표시가 있는 키를 시프트를 누르지 않고서 누르면 나옵니다.

시프트를 누르면 파이프(|)가 나오기 때문입니다.

그래서 보통 c언어에서 많이 쓰는 제어문들을 아래의 표에 한 번 정리를 해봤습니다.

제어문자 이름 의미
\0 널문자 문자열의 끝부분
\a 경고(bell) "삐" 하는 경고음 발생
\b 백스페이스(backspace) 커서를 현재 위치에서 한 칸 뒤로 물림
\t 수평탭(horizontal tab) 커서 수평 옮김 문자, 탭 키를 누른 것과 같이 다수의 칸을 옮김
\n 줄바꿈(new line) 개행 문자, 엔터 키를 누른 것과 같음
\v 수평탭(vertical tab) 커서 수직 방향 옮김 문자, 탭 키를 누른 것과 같음
\f 폼 피드(form feed) 주로 프린터에서 강제적으로 다음 페이지로 넘길 때 사용
\r 캐리지 리턴(carriage return) 커서를 현재 라인에서 시작 위치로 옮김
\" 큰 따옴표 큰따옴표 입력
\' 작은 따옴표 작은 따옴표 입력
\\ 역슬래시(back slash) 역슬래시 입력

이런 식의 특수 문자열을 사용하곤 합니다.

제가 사용해본 바로는 여기에서 제일 많이 쓰는 건 \0, \n, \t, \v 정도를 가장 많이 썼습니다.

하지만 나머지 제어 문자도 종종 쓰이니 알아두시면 좋습니다.

그러면 간단한 예제를 통해서 같이 살펴봅시다.

#include <stdio.h>

int main()

{
  int id, pass;

  printf("아이디와 패스워드를 4개의 숫자로  입력하세요 :\n");

  printf("id : ____\b\b\b\b"); // 백스페이스
  scanf("%d", &id);

  printf("pass : ____\b\b\b\b");
  scanf("%d", &pass);

  printf("\a입력된 id는 \"%d\"이고, 패스워드는 \"%d\"입니다.\n", id, pass);

  return 0;
}

요렇게 입력을 하게 되면 id 칸과 비밀번호 입력 칸에서 백스페이스가 각각 4번씩 적용이 되어서 뒤로 가서 제일 첫 번째 언더 바가 있는 부분에서 입력이 시작이 됩니다.

그리고 입력을 하고 나면 본인이 입력한 id와 비밀번호를 알려주는 출력 문구가 나옵니다.

그럼 결과 화면을 같이 보실까요?

아이디와 패스워드를 4개의 숫자로  입력하세요 :
id : 0000
pass : 1234
입력된 id는 "0"이고, 패스워드는 "1234"입니다.

이렇게 잘 나오는 것을 보실 수 있죠?

이런 식으로도 로그인 템플릿을 만들기도 합니다.

하지만 요즘은 html이라는 훌륭한 프런트 엔드 개발 언어가 있어서 잘 안 쓰기는 합니다.

 

3. 정수형으로써의 char형

여기에서 우리가 주목해야 하는 사실 하나가 있습니다.

그건 바로 char형은 문자를 받을 때 쓰는 자료형이긴 하지만,

사실은 8비트의 정수를 저장할 때 쓰이는 자료형입니다.

그래서 일단 우리가 문자를 받을 때 쓰는 자료형이기 때문에 문자를 받을 수 있으며,

그와 더불어서 정수의 값도 저장이 가능합니다.

그리고 char 자료형은 시스템에 따라서 부호가 있는 자료형으로 구현이 될 때가 있고,

반대로 부호가 없는 자료형으로 구현이 될 때가 있습니다.

그래도 기본적으로는 부호가 있는 자료형으로 세팅이 되어있습니다.

이를테면 c언어 베이스의 객체지향 언어인 c++에서는 부호가 있는 자료형으로 세팅이 되어있습니다.

그래서 이게 기본 스텐스이기 때문에 우리는 signed와 unsigned 수식자를 이용하여 부호의 설정을 할 수가 있습니다.

일단 기본적으로 signed가 생략이 되어있는 부호가 있는 자료형이기 때문에, 부호가 없는 자료형으로 쓰기 위해서는 char 자료형 변수 앞에 unsigned를 넣어주면 됩니다.

signed(부호가 있는) char형의 범위는 -128 ~ 127까지, unsigned(부호가 없는) char 자료형의 범위는 0에서 255까지 범위를 저장할 수 있습니다.

그래서 우리가 정수형 자료형인 숫자를 char에 입력을 했을 때 출력이 가능했던 것입니다.

우리가 아까 다뤘던 아스키코드가 그 예시입니다.

그러면 같이 간단한 예제를 통하여 같이 살펴보도록 하겠습니다.

#include <stdio.h>

int main()

{
  char code = 'A';

  printf("%d %d %d \n", code, code + 1, code + 2);
  printf("%c %c %c \n", code, code + 1, code + 2);

  return 0;
}

이렇게 우리가 정수형으로 받을 때의 결과와 문자형으로 받을 때의 결과를 알아보기 위해서 출력할 때의 형식 지정자를 다르게 소스를 작성해봤습니다.

이럴 경우에 형식 지정자가 정수형인 %d인 경우, 아스키코드에 상응하는 숫자가 나오고, 문자형을 받는 형식 지정자인 %c인 경우는 문자가 출력이 됨을 볼 수 있습니다.

그럼 결과 화면을 같이 보실까요?

65 66 67 
A B C

이렇게 형식 지정자를 정수로 했을 경우에는 아스키 코드 번호가 출력이 되는 것을 볼 수 있고,

형식 지정자를 문자로 했을 경우에는 아스키 코드 번호에 상응하는 문자가 출력이 됨을 볼 수 있습니다.

그래서 우리는 정수를 이용해도 char형을 쓸 수 있습니다.

하지만 가독성을 위해서 보통 코드 번호를 쓰지는 않고, 문자를 그대로 입력을 해서 출력을 합니다.

 

여기까지 c언어 문자형에 대하여 알아보았습니다.

다음 포스팅에서는 변수의 초기값을 이용하여 작성한 간단한 예제를 풀어보는 시간을 가져보려 합니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다 ~

반응형

댓글