Chapter 02. 데이터

나혜수·2023년 1월 10일
0

0과 1로 숫자를 표현하는 방법

정보단위

컴퓨터는 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 이다.


이진법 (Binary)

십진수 음수를 표현할 때는 단순히 숫자 앞에 '-'를 붙이면 그만이다. 그렇다면 이진수도 똑같이 마이너스를 붙이면 될까? 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 ~ 15A ~ F로 표기한다. 주로 코드상에서 십육진수를 표기할 때 숫자 앞에 0x를 붙여 구분한다.

십육진법을 사용하는 주된 이유 중 하나는 이진수 ↔ 십육진수 변환이 쉽기 때문이다.

십육진수를 이진수로 변환하기

16진수를 이루는 숫자 하나를 2진수로 표현하려면 4비트가 필요하다. 16진수 한 글자를 4비트의 이진수로 간주하여, 글자 각각 이진수로 변환하고 그것들을 그대로 이어붙이면 16진수가 2진수로 변환된다.

이진수를 십육진수로 변환하기

반대로 2진수를 16진수로 변환할 때는 이진수 숫자를 4개씩 끊고, 4개의 숫자를 하나의 16진수로 변환한 뒤 그대로 이어붙이면 된다.



0과 1로 문자를 표현하는 방법

문자 집합과 인코딩

컴퓨터가 인식하고 표현할 수 있는 문자의 모음을 문자 집합 (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이다.


EUC-KR

한글은 각 음절 하나하나가 초성 + 중성 + 종성의 조합으로 이루어져 있다. 그래서 한글 인코딩 방식에는 2가지 방식, 완성형조합형이 존재합니다.

완성형 인코딩 : 초성 + 중성 + 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식

조합형 인코딩 : 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자코드를 완성하는 인코딩 방식

EUC-KR은 완성형 인코딩 방식으로 한 단어에 2바이트 크기의 코드를 부여한다. EUC-KR 인코딩 방식으로 총 2350개 정도의 한글 단어를 표현할 수 있지만 한글 전체를 표현할 수는 없다.


유니코드와 UTF-8

EUC-KR 인코딩 덕분에 한글을 표현할 수 있게 되었지만, 모든 한글을 표현할 수 없다는 한계가 있다. 또한 이렇게 언어별로 인코딩을 해야 한다면 다국어를 지원하는 프로그램을 만들 때 각 나라 언어의 인코딩을 모두 알아야 하는 번거로움이 있다. 그래서 등장한 것이 유니코드 unicode 문자집합이다.

유니코드는 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지도 코드로 표현할 수 있는 통일된 문자 집합이다.

유니코드는 글자에 부여된 값 (코드 포인트) 자체를 인코딩 값으로 삼지 않고, 이 값을 다양한 방법으로 인코딩한다. 이런 인코딩 방법에는 UTF-8, UTF-16, UTF-32 등이 있다.
(UTF : Unicode Transformation Format)

profile
오늘도 신나개 🐶

0개의 댓글