삽질의 현장/- C

곱씹어보자 C!_#009_ 삽잡이의 두서없이 막말하는 아스키코드

shovelman 2015. 6. 24. 06:17
문자 인코딩에 대해서 혹시 아시나요? 
문자나 기호들의 집합을 컴퓨터에서 저장하거나 통신에 사용할 목적으로
어떠한 특정 표준적인 형태로 변환하는 것 
즉, 부호화하는 방법을 문자 인코딩이라고 합니다.

예... 맞습니다 위키백과와 네x버가 알려줬습니다. 여긴 다x 티스토리니까... 아하하 

문자 인코딩의 예로써는 대표적으로 많이들 들어보신

바로 아스키코드(ASCII) 가 있죠.


많은 인코딩들 중에서 왜 ASCII 코드를 언급했느냐 하면 말입니다,

C언어에서는 ASCII 코드를 사용하기 때문이죠.


우리가 C언어를 하면서 적어도 알아야 하는 대표적인 아스키 코드 넘버들이 있습니다.

A(65), a(97), 0(48)

뭐 이 셋만 알면 나머지 것들은 알기 쉽겠죠...


다른 인코딩들에서는 정수와 문자를 구분합니다.

넌 문자고! 난 정수야! (어디서 많이 들어본듯한.... 나만 재밌음 ㅋㅋㅋ)


하지만 C/C++에서는 문자 형식이라는 것이 존재하지 않습니다.

근데 문자 어떻게 쓸 수 있냐... 라고 저한테 버럭하신다면... 그러지 마세요...

장난이구, 근데 맞아요.

단지 정수형식의 문자를 담아내는 것 뿐이에요.


말이 어렵나요?


다시 말씀드린다면, C언어는 문자라는 것을 가지고 있지 않다는 것입니다.

단지 정수와 실수만을 가지고 있는 것이죠...


데이터 타입만 봐도 아시는게

정수형(char, short, int, long), 실수형(float, double) 은 있지만

문자형은 따로 없습니다.


일반적으로 C언어에서 문자를 char, int형 변수에다가 쓰는 것일 뿐입니다.

그렇다면 문자를 왜 대부분 char형에 다가 쓰냐 하면

어차피 1 Byte를 넘지 않으니까 char에다가 쓰게 되는 것입니다.

왜? C언어의 문자 형식은 ASCII라고 했으며

ASCII 코드는 127까지 밖에 없기 때문에 1 Byte를 넘을 일이 없기 때문입니다.


C#이나 Java와 같이 최신(?) 언어들같은 경우에는 

유니코드만을 받는다고 하더군요... 


C언어는 기억하시죠... 모두 정수로 담고 있다는 것을...

단, 어떻게 표현할지에 대해서만 정해주면 문자열도 사용할 수 있다 이겁니다.

물론, 다른 언어들에 비해 문자열을 다루기가 어렵죠...

다른 언어들은 알아서 다 처리를 해주지만

C언어같은 경우에는 내가 다 해야되거든요...


코드를 한번 보시죠


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <conio.h>
 
void main()
{
    int n = _getch();
 
    switch ( n )
    {
    case 1 : 
        printf("A\n"); break;
    case 2 :
        printf("B\n"); break;
    case 3 :
        printf("C\n"); break;
    default:
        printf("default...\n"); break;
    }
}
cs


우선, 우리는 _getch() 라는 함수를 사용하기 위해 

그 함수가 들어있는 conio.h 헤더파일을 선언했습니다.


_getch() 함수의 기능은 키보드로 1자를 입력받는다는 것입니다.

코드를 간단하게 해석하자면

int형 변수에 1자가 입력 받게 됩니다.


스위치 문에서는 1, 2, 3 그리고 default의 case 문이 있군요...

확인을 위해서 1, 2, 3 을 하나씩 입력해보세요...


어떻게 될까요? 3초동안 생각해보시고~ 하나 둘 셋 끝...


다 default로 나와요... 왜냐?

우리가 백날 1, 2, 3, 4 ... 입력해도 C언어에서는 ASCII 코드로 생각해요

결국 1, 2, 3 눌러도 C언어에서는 49, 50, 51로 생각한다는 것이죠...


그럼 어떻게 해요... 라고 말씀드리자면

대표적으로 각 case 문의 1, 2, 3을 문자열로 만들면 되겠죠...

'1', '2', '3' 이런식으로 만든다면

컴파일러는 아... 49, 50, 51이군! 이렇게 인식한다는 것입니다.

즉, 컴파일러는 모든 문자를 정수로 생각한다는 점.


C/ C++은 유효성검사와 같이 필터링하는 기능이 없기 때문에

위에서 말했듯이 우리가 직접 다 해줘야되요...

불편할 수도 있겠죠... 하지만 나름 장점도 있다는 점.


프로그램을 하는 분야에는 각자에 최적화 되어있는 프로그래밍 언어들이 있겟죠...

아두이노와 같은 프로그램의 경우 다 C++로 구현한다고 해요...

불편한데 왜 하냐...

왜냐하면 기기를 세세하게 컨트롤해야할 필요성이 있는 그 분야에서는

C/C++이 굉장히 어울리기 때문이죠.


아무튼... 우리 눈에는 문자로 보이더라도

C언어로 볼 때는 모두 정수라는 거...


우리 눈에는 1, 2, 3은 1, 2, 3이지만

컴파일러에게는 백날 49, 50, 51이라는 거...


아오... 왜 이렇게 만들었대...

이런 생각은 노노하시죠,... 받아드리세요! 아하하...


재밌다~ C언어 재밌죠...

뭔가 봐도 봐도 새롭네요... 초보라 그런가...