컴퓨터는 0과 1로 모든 정보를 표현하고, 0과 1로 표현된 정보만을 이해할 수 있다.
0과 1을 나타내는 가장 작은 정보단위를 비트(bit)
라고 한다. 비트는 2가지 정보 (0 or 1)를 표현할 수 있다. 같은 개념으로 n개의 비트로 2n가지 정보를 표한할 수 있다.
우리가 실행하는 프로그램은 수십만, 수백만 비트로 이루어져 있다. 프로그램의 크기를 말할 때 표현의 편의를 위해 비트보다 큰 단위를 사용한다.
단위 | |
---|---|
1바이트 (1byte) | 8비트 |
1킬로바이트 (1kB) | 1000byte |
1메가바이트 (1MB) | 1000kB |
1기가바이트 (1GB) | 1000MB |
1테라바이트 (1TB) | 1000GB |
✍️ 워드
: 워드란 CPU가 한 번에 처리할 수 있는 데이터의 크기를 의미한다. 워드 크기는 CPU마다 다르지만, 현대 컴퓨터의 워드 크기는 대부분 32bit
or 64bit
이다.
십진수 음수를 표현할 때는 단순히 숫자 앞에 '-'를 붙이면 그만이다. 그렇다면 이진수도 똑같이 마이너스를 붙이면 될까? NO
컴퓨터는 0과 1만을 이해할 수 있기 때문에 마이너스 부호를 사용하지 않고 0과 1만으로 음수를 표현해야 한다. 이진수 음수를 표기하는 가장 일반적인 방법은 2의 보수
표기법이다.
2의 보수 : 양수의 n비트 2진수에서 가장 오른쪽의 0에서 처음으로 나오는 1까지 그대로 두고 나머지 왼쪽 비트를 모두 1의 보수로 바꾸는 방법
1의 보수 : 주어진 2진수의 비트를 0은 1로, 1은 0으로 변환하는 방법
-1011(2)을 표현하기 위한 음수로서 0101(2)과 십진수 5를 표현하기 위한 양수로서의 0101(2)은 똑같이 생겼는데 어떻게 구분하는가?
컴퓨터 내부에서는 어떤 수를 다룰 때 이 수가 양수인지 음수인지 구분하기 위해 플래그
를 사용한다. (플래그에 관한 내용은 4장에서 자세히 다룰 것이다.)
✍️ 2의 보수 표기법은 가장 널리 사용되는 방식이지만 완벽한 방식은 아니다.
예를 들어 23을 음수로 표기하면 1000(2) → 1000(2) 음수로 표현한 값과 양수로 표현한 값이 달라진다. 즉, 2n의 보수를 취하면 자기 자신이 되어 n비트로는 -2n과 2n 수를 동시에 표현할 수가 없다.
이진법은 0과 1로 모든 숫자를 표현하다 보니 숫자의 길이가 너무 길어진다는 단점이 있다. 그래서 데이터를 표현할 때에는 이진법 외에 십육진법도 자주 사용한다. 십육진법
은 수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식이다. 십진수 10 ~ 15
를 A ~ F
로 표기한다. 주로 코드상에서 십육진수를 표기할 때 숫자 앞에 0x
를 붙여 구분한다.
십육진법을 사용하는 주된 이유 중 하나는 이진수 ↔ 십육진수 변환이 쉽기 때문이다.
16진수를 이루는 숫자 하나를 2진수로 표현하려면 4비트가 필요하다. 16진수 한 글자를 4비트의 이진수로 간주하여, 글자 각각 이진수로 변환하고 그것들을 그대로 이어붙이면 16진수가 2진수로 변환된다.
반대로 2진수를 16진수로 변환할 때는 이진수 숫자를 4개씩 끊고, 4개의 숫자를 하나의 16진수로 변환한 뒤 그대로 이어붙이면 된다.
컴퓨터가 인식하고 표현할 수 있는 문자의 모음을 문자 집합 (character set)
이라고 한다. 문자 집합에 속하는 문자라고 해서 컴퓨터가 그대로 이해할 수 있는 건 아니다. 문자를 0과 1로 변환해야 비로소 이해할 수 있다. 이 변환과정을 문자 인코딩 (character encoding)
이라 하고 인코딩 후 0과 1로 이루어진 결과값이 문자코드가 된다. 인코딩의 반대과정, 즉 0과 1로 이루어진 문자코드를 사람이 이해할 수 있는 문자로 변환하는 과정은 문자 디코딩 (character decoding)
이라 한다.
아스키 ASCII (american standard code for information interchange)는 초창기 문자 집합 중 하나로 영어 알파벳, 아라비아 숫자, 일부 특수문자를 표현한다. 아스키 문자들은 각각 7비트로 표현되는데, 7비트로 표현될 수 있는 정보의 가짓수는 27 = 128개이다.
실레로 하나의 아스키 문자를 나타내기 위해 8비트를 사용한다. 하지만 8비트 중 1비트는 parity bit
라고 불리는 오류 검출을 위해 사용되는 비트이기 때문에 실질적으로 문자 표현을 위해 사용되는 비트는 7비트이다.
아스키 문자들은 128개의 숫자 중 하나의 고유한 수에 일대일 대응된다. 아스키 문자에 대응된 고유한 수를 아스키 코드
라 한다.
아스키 코드는 매우 간단하게 인코딩된다는 장점이 있지만, 한글 등 영어 외의 언어를 표현할 수 없다. 이러한 이유로 등장한 한글 인코딩 방식이 바로 EUC-KR
이다.
한글은 각 음절 하나하나가 초성 + 중성 + 종성의 조합으로 이루어져 있다. 그래서 한글 인코딩 방식에는 2가지 방식, 완성형
과 조합형
이 존재합니다.
완성형 인코딩 : 초성 + 중성 + 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식
조합형 인코딩 : 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자코드를 완성하는 인코딩 방식
EUC-KR은 완성형 인코딩 방식으로 한 단어에 2바이트 크기의 코드를 부여한다. EUC-KR 인코딩 방식으로 총 2350개 정도의 한글 단어를 표현할 수 있지만 한글 전체를 표현할 수는 없다.
EUC-KR 인코딩 덕분에 한글을 표현할 수 있게 되었지만, 모든 한글을 표현할 수 없다는 한계가 있다. 또한 이렇게 언어별로 인코딩을 해야 한다면 다국어를 지원하는 프로그램을 만들 때 각 나라 언어의 인코딩을 모두 알아야 하는 번거로움이 있다. 그래서 등장한 것이 유니코드 unicode 문자집합이다.
유니코드는 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지도 코드로 표현할 수 있는 통일된 문자 집합이다.
유니코드는 글자에 부여된 값 (코드 포인트) 자체를 인코딩 값으로 삼지 않고, 이 값을 다양한 방법으로 인코딩한다. 이런 인코딩 방법에는 UTF-8
, UTF-16
, UTF-32
등이 있다.
(UTF : Unicode Transformation Format)