컴퓨터는 어떻게 0과 1로 모든 것을 표현할까
컴퓨터는 0과 1만 다룬다는 말을 한 번쯤 들어보셨을 겁니다. 그런데 막상 생각해 보면 이상합니다. 우리는 컴퓨터로 글을 쓰고, 사진을 보고, 음악을 듣고, 영상을 봅니다. 이 모든 것이 정말 0과 1 두 개의 숫자로 표현된다는 게 잘 와닿지 않습니다.
이 글에서는 컴퓨터가 어떻게 글자, 숫자, 색, 소리 같은 전혀 다른 정보를 전부 0과 1로 바꿔서 다루는지 직관적으로 설명하겠습니다. 수학은 거의 쓰지 않습니다. 핵심만 잡으면 생각보다 단순한 이야기입니다.
왜 하필 0과 1인가 #
컴퓨터 안에서는 전기가 흐릅니다. 그리고 가장 다루기 쉬운 신호는 “전기가 흐른다"와 “전기가 흐르지 않는다”, 이 두 가지 상태입니다.
전구의 스위치를 떠올리면 됩니다. 켜짐과 꺼짐, 단 두 가지뿐입니다. 애매하게 절반만 켜진 상태를 구분하려고 하면 어디까지가 절반인지 판단이 어렵고 오류도 생깁니다. 반면 켜짐과 꺼짐만 구분하면 헷갈릴 일이 거의 없습니다.
컴퓨터의 부품인 트랜지스터가 바로 이 역할을 합니다. 전기를 흐르게 하거나 막는 아주 작은 스위치입니다. 이 켜짐과 꺼짐을 숫자로 적은 것이 1과 0입니다. 그래서 컴퓨터는 0과 1을 쓰는 게 아니라, 켜짐과 꺼짐이라는 가장 안정적인 두 상태를 그냥 0과 1이라고 부르는 것뿐입니다.
비트와 바이트 #
이 0 또는 1 하나를 비트(bit)라고 부릅니다. 컴퓨터가 다루는 정보의 가장 작은 단위입니다.
비트 하나는 0 또는 1, 두 가지만 표현합니다. 그런데 비트를 여러 개 묶으면 표현할 수 있는 경우의 수가 늘어납니다. 비트 2개를 묶으면 00, 01, 10, 11로 네 가지입니다. 비트 3개면 여덟 가지입니다. 하나 늘어날 때마다 두 배씩 늘어납니다.
이렇게 비트가 n개면 2의 n제곱만큼의 경우를 표현할 수 있습니다. 비트 8개를 묶으면 2의 8제곱, 즉 256가지입니다. 이 8비트 묶음을 1바이트(byte)라고 부릅니다. 파일 크기를 이야기할 때 나오는 그 바이트가 맞습니다.
정리하면 이렇습니다. 1비트는 0 또는 1이고, 8비트가 모이면 1바이트이며, 1바이트로는 256가지를 구분할 수 있습니다. 이 256가지라는 숫자는 뒤에서 다시 등장하니 기억해 두면 좋습니다.
숫자: 이진법 #
우리가 평소 쓰는 숫자는 0부터 9까지 열 개의 기호를 씁니다. 10이 되면 한 칸을 올립니다. 이걸 십진법이라고 합니다.
컴퓨터는 0과 1 두 개만 쓰므로, 2가 되면 한 칸을 올립니다. 이게 이진법입니다. 원리는 똑같고 쓰는 기호의 개수만 다릅니다.
간단한 예를 보겠습니다. 이진수 1011을 읽어보겠습니다. 오른쪽부터 1, 2, 4, 8의 크기를 가지며, 1이 켜진 칸의 크기만 더합니다. 1011은 오른쪽부터 1(켜짐), 2(꺼짐), 4(켜짐), 8(켜짐)이므로 1 더하기 2는 빼고, 4와 8을 더해서 1 더하기 4 더하기 8, 즉 11입니다. 복잡해 보이지만 결국 켜진 칸의 값을 더하는 것이 전부입니다.
깊이 외울 필요는 없습니다. “컴퓨터는 숫자를 0과 1의 조합으로 적는다” 정도만 이해하면 충분합니다.
글자: 약속으로 표현 #
여기서 한 가지 의문이 생깁니다. 숫자야 그렇다 치고, 글자는 어떻게 0과 1이 될까요.
답은 약속입니다. 사람들이 “이 숫자는 이 글자를 뜻한다"고 미리 정해두는 것입니다. 이 약속을 인코딩이라고 부릅니다.
가장 오래된 약속 중 하나가 ASCII입니다. ASCII에서는 대문자 ‘A’를 65번으로 정해두었습니다. ‘B’는 66, ‘C’는 67입니다. 그래서 컴퓨터가 ‘A’를 저장할 때는 실제로 65라는 숫자를 저장하고, 그 65는 다시 이진수로 바뀌어 0과 1로 기록됩니다.
영어 알파벳과 기호 정도는 256가지 안에 다 들어가므로 1바이트로 충분했습니다. 그런데 한글, 한자, 이모지처럼 글자가 훨씬 많은 경우는 256가지로 부족합니다. 그래서 전 세계의 거의 모든 문자에 번호를 붙인 유니코드라는 더 큰 약속이 생겼고, 이걸 효율적으로 저장하는 방식이 UTF-8입니다. 우리가 보는 한글과 이모지는 대부분 이 방식으로 다뤄집니다.
결국 글자도 약속에 따른 숫자이고, 숫자는 다시 0과 1입니다.
색과 소리 #
이쯤 되면 그림과 음악도 짐작이 갑니다. 똑같이 숫자로 바꾸면 됩니다.
먼저 색입니다. 화면은 픽셀이라는 아주 작은 점들로 이루어져 있습니다. 점 하나의 색은 빨강, 초록, 파랑 세 가지 빛의 세기로 표현합니다. 머리글자를 따서 RGB라고 부릅니다. 각각의 세기를 0부터 255까지의 숫자로 적습니다. 빨강 255, 초록 0, 파랑 0이면 순수한 빨간색이고, 셋 다 255면 흰색입니다.
여기서도 아까 그 256가지가 나옵니다. 0부터 255까지가 정확히 256가지이고, 그래서 색깔 하나의 세기는 1바이트로 기록됩니다. 사진 한 장은 이런 픽셀이 수백만 개 모인 것이므로, 결국 거대한 숫자의 나열입니다.
소리도 비슷합니다. 소리는 원래 끊김 없이 이어지는 파형입니다. 컴퓨터는 이 파형을 아주 짧은 간격으로 잘게 끊어서, 각 순간의 높낮이를 숫자로 기록합니다. 이걸 샘플링이라고 합니다. 1초에 수만 번씩 측정하기 때문에, 다시 이어 들으면 사람 귀에는 끊김 없는 음악으로 들립니다. 음악 파일 역시 숫자의 나열인 셈입니다.
마무리 #
지금까지 본 것을 한 줄로 줄이면 이렇습니다. 컴퓨터에게 세상의 모든 정보는 결국 0과 1의 긴 나열입니다.
글자도, 숫자도, 사진의 색도, 음악의 파형도 전부 숫자로 바꾸고, 그 숫자를 다시 0과 1로 적습니다. 그리고 “이 숫자는 글자 A다”, “이 숫자는 빨강의 세기다” 같은 약속, 즉 인코딩이 그 0과 1을 다시 글자와 그림과 소리로 되돌려 줍니다. 컴퓨터가 마법처럼 보이는 일은 사실 이 단순한 약속들이 겹겹이 쌓인 결과입니다.
그리고 이 0과 1을 어떻게 다룰지 컴퓨터에게 지시하는 일이 바로 프로그래밍입니다. 컴퓨터가 정보를 다루는 원리가 궁금하셨다면, 그 정보를 직접 다루는 법인 프로그래밍에도 관심이 생기실 겁니다. 이어서 왜 모든 사람이 프로그래밍을 배워야 하는가도 함께 읽어보시길 권합니다.