데이터

Computer Science/OS + CA · 2023. 3. 31. 13:21

이번 장에서는 컴퓨터가 0과 1로 데이터를 표현하고 학습하는 방법에 대해 알아본다. 

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

정보 단위 

컴퓨터가 개발된 초기에 '전기 신호가 들어오고, 들어오지 않고'를 하나의 의미로 받아들였다. 따라서, 전기 신호가 들어온 상태(on) / 들어오지 않은 상태(off)를 각각 1,0으로 표현하였다. 이처럼 0과 1을 표현할 수 있는 가장 작은 정보 단위를 비트라고 한다. 

 

  • 1 비트는 (꺼짐), (켜짐)으로 2가지 정보를 표현할 수 있다.
  • 2 비트는 (꺼짐, 꺼짐), (꺼짐, 켜짐), (켜짐, 꺼짐), (켜짐, 켜짐)으로 4가지 정보를 표현할 수 있다. 
  • 즉, n 비트는 2의 n제곱개의 정보를 표현할 수 있게된다. 

우리가 사용하는 파일이나 프로그램은 수백만 개의 비트로 이루어져 있다. 따라서, 프로그램 크기를 말할 때 편의를 위해 비트보다 더 큰 단위를 사용한다.

※ 워드(Word)란 CPU가 한번에 처리할 수 있는 데이터 크기를 의미한다. 현재 CPU가 한번에 처리할 수 있는 단위에 따라서 워드 값이 달라진다. 현재 나오고 있는 컴퓨터의 크기는 대부분 32 bit, 64 bit이다. 

이진법 

먼저, 컴퓨터가 0과 1만으로 어떻게 숫자를 나타내는지 알아본다. 0과 1만으로 모든 숫자를 표현하는 방법을 이진법이라고 한다. 이진법은 1을 넘어가는 시점에서 자리올림을 하여, 0과 1만으로 모든 수를 표현하는 방법이다.

이진수의 음수 표현

컴퓨터는 마이너스 부호가 아닌 0과 1만으로 음수를 표현해야 한다. 0과 1만으로 음수를 표현하는 방법 중 가장 널리 사용되는 방법은 2의 보수(two's complement)를 구하는 방법이다. 2의 보수는 어떤 수를 그보다 큰 2의 n제곱에서 뺀 값을 의미한다. 

  • example) 이진수 11에 2의 보수를 구하는 예시
    • 이진수 11보단 큰 이진수 110에서 이진수 11을 뺀 값은 이진수 01이다. 

위의 example은 2의 보수를 사전적 의미에 입각하여 계산한 예시이다. 2의 보수는 1의 보수를 구하고 1을 더한 값으로 매우 단순하게 표현이 가능하다.

  • 1의 보수는 모든 0과 1을 뒤집는 것이다. 
  • 위의 방법으로 2의 보수를 매우 단순하게 구할 수 있다. 
  • 어떤 수의 음수를 2번 구하면 처음 그 수가 나오는 것처럼, 2의 보수를 2번 구할 경우, 자기 자신이 나오게 된다. 

실제 이진수만 보게 되었을 때, 이 수가 음수인지 양수인지 구분할 수 없다. 따라서 컴퓨터에서는 플래그라는 개념을 사용하여, 부호를 구분한다. 

십육진법

이진법을 사용하여 모든 숫자를 표현하면, 너무 숫자의 길이가 길어지는 단점이 존재한다. 따라서, 데이터를 표현할 때는 수가 15를 넘어가는 시점에 자리 올림을 하는 표현 방식인 십육진법을 사용한다.

  • 10, 11, 12, 13, 14, 15를 A, B, C, D, E, F로 표기하여, 한 글자로 열 여섯 종류의 정보를 표현할 수 있게 된다. 
  • 십육진법은 이진수와의 변환이 쉽기 때문에, 십진수 대신 사용한다. 

십육진수 -> 이진수, 이진수 -> 십육진수 변환

십육진수는 한 글자당 16 종류의 숫자를 표현할 수 있기 때문에, 십육진수를 이루는 숫자 하나를 이진수로 표현하려면 4bit가 필요하다.

가장 간편한 방법 중 하나는 십육진수 한 글자를 4비트의 이진수로 간주하는 것이다.

  • 십육진수가 있을 때 각 숫자를 이진수를 표현한 것을 그대로 이어붙혔을 때, 이진수로 표현한 값이 나온다. 
  • 반대로 이진수 숫자를 네개 씩 끊고, 네 개의 숫자를 하나의 십육진수로 변환한 뒤 그대로 이어붙혔을 때, 십육진수로 표현한 값이 나온다. 

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

문자 집합과 인코딩

  • 컴퓨터가 인식하고 표현할 수 있는 문자의 모음을 문자 집합이라고 한다. 
  • 문자를 0과 1로 변환하여 문자 코드를 만드는 것을 문자 인코딩이라 한다.
  • 인코딩의 반대 과정으로, 0과 1로  만들어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정을 문자 디코딩이라고 한다. 

아스키 코드

아스키(ASCII:American Standard Code for Information Interchange)는 초창기 문자 집합 중 하나로, 영어 알파벳과 아라비아 숫자, 일부 특수문자 등을 포함한다. 아스키 문자 집합에 속한 문자들은 각각 7비트로 표현(실제로는 오류 검출을 위해 사용되는 parity bit가 1 bit를 차지해서 8bit이다)되고, 정보의 가짓수는 2의 7제곱개이기 때문에, 총 128개의 문자를 표현할 수 있다.

ASCII

  • 아스키 문자들은 0부터 127까지 총 128개의 숫자 중 하나의 고유한 수로 일대일 대응되고, 이때 대응된 고유한 수를 아스키 코드라고 한다. 
  • 아스키 코드를 이진수로 표현하여, 아스키 문자를 0과 1로 표현이 가능하다. 
  • ex) 'A'는 이진수 1000001로 인코딩 되고, 'a'는 십진수 이진수 1100001로 인코딩 된다.
  • 아스키 코드는 128개보다 많은 문자를 표현하지 못하기 때문에, 한글 뿐만 아니라 저 집합에 없는 다른 문자들이나, 특수문자를 표현할 수 없다.   

EUC-KR

한국을 포함한 영어권 외의 나라들은 고유한 문자 집합과 인코딩 방식이 필요하였고, 그 중 한글 인코딩 방식으로 EUC-KR이 있다. 한글은 각 음절 하나하나가 초성, 중성, 종성의 조합이기 떄문에, 완성형 인코딩과 조합형 인코딩이 존재한다. 

  • 완성형 인코딩 방식은 초성, 중성, 종성의 조합으로 이루어진 하나의 글자에 고유한 코드를 부여하는 것이다. ex) 가, 나, 다 ..
  • 조합형 인코딩 방식은 초성, 중성, 종성을 위한 각각에 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식이다. 
  • EUC-KR은 완성형 인코딩 방식으로, 한글 단어에 2바이트의 크기를 부여한다.
  • 단점으로 문자 집합의 정의되지 않는 단어들을 표현할 수 없다.

인코딩 방식
EUC-KR 일부

유니코드와 UTF-8

언어별로 인코딩을 나라마다 해야하면 다국어를 지원하는 프로그램을 만들 때 번거로움이 발생할 수 있다. 모든 언어를 아우르는 문자 집합과 통일된 표준 인코딩 방식으로 등장한 것이 유니코드 문자 집합이다.

유니코드 표 일부

  • 유니코드는 아스키 코드나 EUC-KR과 같이 각 문자마다 고유한 값이 부여된다. 
  • 유니코드는 부여된 값 자체를 인코딩된 값으로 삼지 않고 다양한 방법으로 인코딩 한다. 
    • UTF-8, UTF-16, UTF-32 .. 등
    • UTF(Unicode Transformation Format)은 유니코드를 인코딩하는 방법이다. 
  • 가장 대중적인 인코딩 방법은 UTF-8이다. 
    • 인코딩한 값의 결과는 1바이트, 2바이트, 3바이트, 4바이트가 될 수 있다. 
    • 유니코드 문자에 부여한 값의 범위에 따라서 몇 바이트가 될지 결정된다.