
02 데이터
02-1 0과 1로 숫자를 표현하는 방법
컴퓨터는 0, 1로 모든 데이터를 표현하지만 0, 1이 아닌 다른 데이터들을 어떻게 처리하는지 의문이 생깁니다. 이번장에서는 이런 데이터들의 표현방식을 공부하게 됩니다.
정보 단위
컴퓨터에서 가장 작은 표현단위인 0, 1만 사용하는 단위를 비트라고 합니다. 비트의 갯수가 n개면, 2^n개의 데이터 표현을 할 수 있습니다. 그 다음으로 바이트는 8개의 비트를 묶은 단위로, 비트보다 한 단계 큰 단위입니다.
이제부터 1000배 단위로 표현 단위가 커지는데요, 1000개의 바이트를 묶은것을 1킬로바이트(KB), 1000킬로바이트를 묶은것을 1메가바이트(MB), 1000메가바이트를 묶은 단위를 1기가바이트(GB), 1000기가바이트를 묶은것을 1테라바이트(TB) 라고 합니다. 이것보다 더 큰 단위도 존재하지만 현재 일반적으로 사용되는 단위는 테라바이트 단위가 제일 큽니다.
이진법
수학에서 0, 1 만으로 숫자를 표현하는 방법을 이진법이라고 합니다. 우리는 일상적으로 십진법을 사용합니다. 십진법은 0~9까지의 열 개의 숫자만으로 모든 수를 표현합니다. 만약 9보다 큰 숫자를 표현하게 되면 자릿수를 올려서 더 큰 숫자를 표현하게 됩니다.
이진법 역시 1보다 큰 숫자는 자릿수를 올려서 표현하게 됩니다. 2는 10, 3은 11 이런식으로요.
이진법으로 표현된 숫자와 십진법으로 표현된 숫자는 구분하기 힘듭니다. 그래서 이진법 표기에는 아래에 (2) 이런 표식을 넣게됩니다.
이진수의 음수 표현
십진수의 경우 숫자 앞에 마이너스 부호를 붙이면 음수 표현이 됩니다. 하지만 컴퓨터에선 0, 1 로만 모든것을 표현해야 하기 때문에 마이너스 부호를 사용할 수 없습니다.
이진수 표현으로 음수를 표현하는 방법 중 가장 많이 사용되는 방법은 2의 보수를 구하는 방법입니다.
2의 보수는 음수를 구하려는 숫자를 그보다 큰 숫자에서 뺀 값을 사용하는 방식입니다. 예를 들어 11의 2의 보수는 11보다 큰 2^n, 즉 100 에서 11을 뺀 01이 됩니다.
2의 보수를 쉽게 구하는 방법으론 '모든 0과 1을 뒤집고, 거기에 1을 더한 값' 방식을 이용할 수 있습니다.
이진법에서 양수값과 음수값은 똑같이 생겼습니다. 1011의 음수인 0101과 십진수 5를 표현하는 0101은 같은 형식이죠. 컴퓨터는 이 둘을 구분하기 위해 플래그를 사용합니다. 플래그 관련 내용은 나중에 다루게 되니 우선은 양수와 음수를 구분하는 기준값이라는 정도로 이해하면 됩니다.
십육진법
2진법은 숫자를 표현할 때 너무 많은 자릿수를 사용하게 됩니다. 그래서 십육진법도 자주 사용됩니다.
십육진법은 0~15까지의 수를 한 자리에 표현하게 되며 9가 넘어가는 숫자부터는 알파벳으로 표현합니다.
십육진법과 이진법은 서로 변환하는데 편리합니다. 이진수를 4자리씩 끊어 16진법으로 표현할 수 있고 그 반대도 가능합니다.
02-2 0과 1로 문자를 표현하는 방법
지금까진 숫자를 표현하는 방법을 알아봤습니다. 이제 문자를 표현하는 방법을 알아보겠습니다.
문자 집합과 인코딩
컴퓨터가 인식하고 표현할 수 있는 문자의 모음을 문자 집합이라고 합니다. 컴퓨터는 문자 집합에 속해 있는 문자를 이해할 수 있고, 반대로 문자 집합에 속해 있지 않은 문자는 이해할 수 없습니다.
문자 집합에 속한 문자는 0과 1로 변환해야 컴퓨터가 이해할 수 있습니다. 이 변환 과정을 문자 인코딩이라 하고 인코딩 후 0과 1로 이루어진 결과값이 문자 코드가 됩니다.
문자 인코딩의 반대 과정을 문자 디코딩 이라고 합니다. 0과 1로 이루어진 문자 코드를 문자로 변환하는 과정입니다.
컴퓨터는 이런 문자 집합과 인코딩을 통해 문자를 저장하고 표현하게 됩니다.
아스키 코드
아스키(ASCII)는 초창기 문자 집합 중 하나로, 영어 알파벳과 아라비아 숫자, 그리고 일부 특수 문자를 포함합니다. 아스키 문자 집합에 속한 문자들은 각각 7비트로 표현되는데, 7비트로 표현할 수 있는 정보의 가짓수는 2^7개로, 총 128개의 문자를 표현할 수 있습니다.
아스키 코드는 매우 간단하게 인코딩된다는 장점이 있지만, 문자 표현 가짓수가 128개로 그 이상의 문자를 표현할 수 없습니다. 영어권을 제외한 다른 나라들이 사용하는 문자들을 저장하기에는 너무 적은 표현방식입니다.
그래서 이런 부족함을 개선하기 위해 나온것이 EUC-KR 입니다.
EUC-KR
한글 인코딩을 이해하려면 한글의 특수성을 알아야 합니다. 영어는 알파벳을 쭉 나열하면 되지만, 한글은 초성, 중성, 종성의 조합으로 이루어져 있습니다. 그래서 한글 인코딩 방식은 두가지 방식이 존재하는데, 하나는 완성형 인코딩이고 다른 하나는 조합형 인코딩 입니다.
완성형 인코딩은 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 코드를 부여하는 방식입니다.
반면 조합형 인코딩은 초성, 중성, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식입니다.
한글 한 글자에 2바이트 코드가 부여됩니다. 그래서 한글 한 글자를 표현하려면 16비트가 필요하게 됩니다. 그리고 16비트는 네 자리 십육진수로 표현할 수 있습니다. 즉 EUC-KR로 인코딩된 한글은 네 자리 십육진수로 나타낼 수 있습니다.
EUC-KR 인코딩 방식으로 총 2,350개 정도의 한글 단어를 표현할 수 있습니다. 하지만 이정도로도 모든 한글 조합을 표현할 수 없습니다. 이런 문제를 해결하고자 CP949라는 마이크로소프트의 인코딩 방식이 나왔으나, 이마저도 한글 전체를 표현하기는 어렵습니다.
유니코드와 UTF-8
만약 언어별로 인코딩을 나라마다 해야 한다면 다국어를 지원하는 프로그램을 만들 때 각 나라 언어의 인코딩을 모두 알아야 하는 번거로움이 있습니다. 그런데 만약 모든 나라 언어의 문자 집합과 인코딩 방식이 통일되어 있다면 언어별로 인코딩하는 수고로움을 덜 수 있습니다.
그래서 등장한 것이 유니코드 문자 집합입니다.
유니코드 문자 집합에서는 아스키 코드나 EUC-KR과 같이 각 문자마다 고유한 값이 부여됩니다.
아스키 코드나 EUC-KR은 글자에 부여된 값을 그대로 인코딩 값으로 삼았지만 유니코드는 조금 다릅니다. 글자에 부여된 값 자체를 인코딩된 값으로 삼지 않고 이 값을 다양한 방법으로 인코딩합니다. 이런 인코딩 방법에는 크게 UTF-8, UTF-16, UTF-32 등이 있습니다.
