컴퓨터 세계 곳곳에 진법이 숨어 있습니다. CSS의 #1A2B3C, 메모리 주소 0x7FFFFFFF, Base64 인코딩, URL의 %20…… 이 모든 신비로워 보이는 문자열 뒤에는 하나의 개념——진법(Number Systems)——이 있습니다. 이를 이해하면 더 많은 기술 원리를 읽어낼 수 있습니다.
1. 진법이란?
진법은 "숫자를 표현하는 데 몇 종류의 기호를 쓰는가"에 관한 규칙입니다. 우리가 일상에서 쓰는 10진법(Base-10)은 0~9의 10가지 기호를 사용하고, 9 다음에 자리올림이 발생해 10이 됩니다.
- 2진법(Base-2):0과 1만 사용. 1 다음에 자리올림이 발생해 10이 됨(10진법의 2를 의미)
- 8진법(Base-8):0~7 사용, 7 다음에 자리올림
- 16진법(Base-16):0~9에 A~F(A=10, …, F=15)를 추가 사용, F 다음에 자리올림
| 10진수 | 2진수 | 8진수 | 16진수 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 8 | 1000 | 10 | 8 |
| 10 | 1010 | 12 | A |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |
| 255 | 11111111 | 377 | FF |
2. 2진수(Base-2)
2진수는 컴퓨터 하드웨어의 언어입니다. 전기 회로에는 "통전"과 "차단" 두 가지 상태만 존재하며, 이것이 각각 1과 0에 대응합니다. 0 또는 1 한 자리를 비트(bit), 8비트를 묶은 것을 바이트(byte)라 합니다.
10진수 → 2진수 변환
방법:2로 반복해서 나누고 나머지를 아래에서 위로 읽습니다.
13 ÷ 2 = 6 나머지 1 ↑
6 ÷ 2 = 3 나머지 0 ↑
3 ÷ 2 = 1 나머지 1 ↑
1 ÷ 2 = 0 나머지 1 ↑
결과:1101(10진수 13 = 2진수 1101)
2진수 → 10진수 변환
방법:각 자리에 2의 거듭제곱을 곱해 합산합니다.
1101 = 1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 8 + 4 + 0 + 1
= 13
3. 16진수(Base-16)
16진수는 프로그래밍에서 가장 흔히 쓰이는 진법입니다. 2진수와 완벽한 대응 관계가 있기 때문입니다:4비트가 정확히 16진수 한 자리에 대응합니다.
2진수:1111 1010 1011 1100
16진수: F A B C → FABC
CSS 색상 코드 예시
#FF5733은 세 쌍의 16진수로 각각 R(빨강)·G(초록)·B(파랑)를 나타냅니다:
| 색상 | 16진수 | 10진수(0–255) |
|---|---|---|
| 빨강(R) | FF | 255 |
| 초록(G) | 57 | 87 |
| 파랑(B) | 33 | 51 |
#FF5733은 rgb(255, 87, 51)과 동일하며, 주황빛 빨강 계열의 색상입니다.
4. URL 인코딩의 16진수
URL에 사용할 수 있는 문자는 제한되어 있어, 허용되지 않는 문자(공백, 한글, 특수 기호 등)는 퍼센트 인코딩(Percent Encoding)으로 표현해야 합니다. 문자의 UTF-8 바이트를 16진수로 변환하고 앞에 %를 붙입니다.
| 원래 문자 | URL 인코딩 | 설명 |
|---|---|---|
| 공백 | %20 | 16진수 20 = 10진수 32(공백의 ASCII 코드) |
| / | %2F | 경로 이외에서 슬래시 사용 시 |
| 한 | %ED%95%9C | UTF-8으로 3바이트 |
5. Base64:자주 사용되는 인코딩 방식
Base64는 진법이 아니라 이진 데이터를 출력 가능한 텍스트로 변환하는 인코딩 방식입니다. 3바이트(24비트)를 4그룹의 6비트로 나누고, 각 그룹을 64개 문자(A–Z, a–z, 0–9, +, /) 중 하나에 대응시킵니다.
원본(ASCII):Man
2진수:01001101 01100001 01101110
6비트 분할:010011 010110 000101 101110
Base64: T W F u → TWFu
Base64 출력은 원래 데이터보다 약 33% 커지지만, 텍스트만 지원하는 채널(이메일, HTML 속성, JSON)에서 이진 데이터를 안전하게 전송할 수 있습니다.
6. 각 언어에서의 진법 표기
| 언어 | 2진수 | 8진수 | 16진수 |
|---|---|---|---|
| Python | 0b1010 | 0o12 | 0xA |
| JavaScript | 0b1010 | 0o12 | 0xA |
| C / C++ | —(네이티브 문법 없음) | 012 | 0xA |
| Java | 0b1010 | 012 | 0xA |
| CSS | — | — | #FF5733 |
정리
진법은 어려운 이론이 아니라 많은 일상적인 기술을 이해하는 열쇠입니다:
- 2진수는 컴퓨터 저층의 언어이자 비트 연산의 기초
- 16진수는 프로그래밍의 공통어. 색상 코드·메모리 주소·해시 값 모두 16진수로 표현됨
- Base64는 2진수를 기반으로 텍스트 환경에서의 이진 데이터 전송 문제를 해결함
- URL 인코딩은 허용되지 않는 문자를 16진수로 표기해 URL에 임의의 문자를 포함 가능하게 함
이러한 기초를 이해하면 %ED%95%9C·#FF5733·TWFu 같은 문자열을 보는 순간 그 의미를 바로 파악할 수 있습니다.