진법·로마숫자 변환기는 같은 수를 2진법·8진법·10진법·16진법, 그리고 로마숫자로 서로 바꿔 주는 도구입니다. 한 칸에 값을 입력하면 나머지 표기법이 동시에 계산되므로, 10진수 255가 16진수로 FF이고 2진수로 11111111이라는 사실을 한눈에 확인할 수 있습니다. 프로그래밍·전자공학 학습, 색상 코드 해석, 파일 권한(chmod) 계산, 시험 문제 검산 등에 두루 쓰입니다.
우리가 일상에서 쓰는 수는 0~9 열 개의 숫자를 쓰는 10진법(decimal)입니다. 하지만 컴퓨터는 전기가 흐르는지(1) 아닌지(0)로만 정보를 다루기 때문에 내부적으로는 0과 1만 쓰는 2진법(binary)으로 동작합니다. 2진수는 자릿수가 너무 길어져 사람이 읽기 어렵기 때문에, 이를 짧게 줄여 표기하는 8진법(octal)과 16진법(hexadecimal)이 함께 쓰입니다.
이 페이지 아래에서는 각 진법의 의미와 서로 변환하는 원리, 0부터 16까지의 진법별 대응표, 그리고 16진수가 프로그래밍에서 어떻게 활용되는지를 정리했습니다. 진법의 개념을 처음 접하는 분도 표와 예시를 따라가면 변환 과정을 손으로 계산할 수 있게 됩니다.
사용 방법
- 변환하고 싶은 표기법 칸을 고릅니다. 예를 들어 10진수 값을 알고 있다면 '10진법' 칸에 숫자를 입력합니다.
- 값을 입력하면 나머지 진법(2·8·16진법)과 로마숫자가 즉시 자동으로 채워집니다.
- 반대로 16진수 코드(예: FF)만 알고 있다면 '16진법' 칸에 FF를 입력해 10진수 255를 역으로 확인할 수 있습니다. 16진법은 대소문자를 구분하지 않습니다.
- 로마숫자는 1~3999 범위만 지원합니다. 이 범위를 벗어나면 로마숫자 칸은 표시되지 않습니다.
진법(base)이란 무엇인가
진법은 '몇 개의 숫자로 수를 표현하는가'를 뜻합니다. N진법은 0부터 N-1까지 N개의 숫자를 쓰며, 한 자리가 가득 차면 윗자리로 올림(carry)이 발생합니다. 각 자리는 밑수(N)의 거듭제곱을 나타냅니다.
예를 들어 10진수 253은 각 자리가 10의 거듭제곱이므로 2×10² + 5×10¹ + 3×10⁰ = 253으로 읽힙니다. 같은 방식으로 2진수 1011은 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8+0+2+1 = 11(10진수)이 됩니다. 즉 진법이 다르면 표기만 달라질 뿐, 가리키는 수의 크기는 같습니다.
- 2진법(binary): 0, 1 두 개의 숫자만 사용. 컴퓨터의 가장 기본 단위(비트).
- 8진법(octal): 0~7 여덟 개 숫자 사용. 2진수 3자리를 1자리로 압축. 유닉스 파일 권한 표기에 사용.
- 10진법(decimal): 0~9 열 개 숫자 사용. 사람이 일상에서 쓰는 수 체계.
- 16진법(hexadecimal): 0~9와 A~F 열여섯 개 사용. 2진수 4자리를 1자리로 압축. 색상 코드·메모리 주소에 사용.
진법별 숫자 대응표 (0~16)
같은 수를 2·8·10·16진법과 로마숫자로 나란히 적으면 아래와 같습니다. 16진법에서 10~15는 A~F로 표기한다는 점, 그리고 로마숫자에는 0이 없다는 점에 주목하세요.
| 10진법 | 2진법 | 8진법 | 16진법 | 로마숫자 |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | (없음) |
| 1 | 1 | 1 | 1 | I |
| 2 | 10 | 2 | 2 | II |
| 3 | 11 | 3 | 3 | III |
| 4 | 100 | 4 | 4 | IV |
| 5 | 101 | 5 | 5 | V |
| 6 | 110 | 6 | 6 | VI |
| 7 | 111 | 7 | 7 | VII |
| 8 | 1000 | 10 | 8 | VIII |
| 9 | 1001 | 11 | 9 | IX |
| 10 | 1010 | 12 | A | X |
| 11 | 1011 | 13 | B | XI |
| 12 | 1100 | 14 | C | XII |
| 13 | 1101 | 15 | D | XIII |
| 14 | 1110 | 16 | E | XIV |
| 15 | 1111 | 17 | F | XV |
| 16 | 10000 | 20 | 10 | XVI |
F 다음은 10입니다
16진법에서 15는 F로 표기하고, 그 다음 수인 16은 자리 올림이 일어나 10(1×16 + 0)이 됩니다. 여기서 '10'은 10진수 십이 아니라 16진수 십육을 뜻합니다. 진법을 명확히 구분하기 위해 16진수는 0xFF, 2진수는 0b1010처럼 접두어를 붙이거나 FF₍₁₆₎ 같은 아래첨자를 씁니다.
진법 변환은 어떻게 하나요
10진수를 다른 진법으로 바꿀 때는 '밑수로 나눈 나머지'를 거꾸로 읽습니다. 예를 들어 10진수 13을 2진수로 바꾸려면 13÷2=6…1, 6÷2=3…0, 3÷2=1…1, 1÷2=0…1이므로, 나머지를 아래에서 위로 읽어 1101이 됩니다.
반대로 다른 진법을 10진수로 바꿀 때는 각 자리에 밑수의 거듭제곱을 곱해 더합니다. 16진수 7EA를 10진수로 바꾸면 7×16² + E(14)×16¹ + A(10)×16⁰ = 1792 + 224 + 10 = 2026입니다.
| 10진법 | 2진법 | 8진법 | 16진법 |
|---|---|---|---|
| 255 | 11111111 | 377 | FF |
| 256 | 100000000 | 400 | 100 |
| 1024 | 10000000000 | 2000 | 400 |
| 2026 | 11111101010 | 3752 | 7EA |
| 65535 | 1111111111111111 | 177777 | FFFF |
2진수 ↔ 16진수는 4자리씩 묶으면 끝
2진수 4자리는 정확히 16진수 1자리에 대응합니다. 예를 들어 11111111을 뒤에서 4자리씩 끊으면 1111(F)과 1111(F)이므로 곧바로 FF가 됩니다. 마찬가지로 2진수 3자리는 8진수 1자리에 대응합니다. 그래서 긴 2진수를 사람이 읽을 때 16진법·8진법으로 줄여 표기합니다.
16진수는 프로그래밍에서 어디에 쓰이나
16진법은 컴퓨터가 다루는 2진 데이터를 사람이 읽기 쉽게 줄여 표현하는 표준 방식입니다. 바이트(8비트)가 정확히 16진수 2자리(00~FF, 즉 0~255)로 표현되기 때문에 코드 곳곳에서 자연스럽게 등장합니다.
- 색상 코드: 웹의 #FF0000은 빨강(R=255), 초록·파랑=0을 뜻합니다. 각 두 자리가 RGB 한 채널의 0~255 값입니다.
- 메모리 주소·포인터: 디버거나 스택 트레이스에 나오는 0x7ffee3a0 같은 주소는 16진수로 표기됩니다.
- 유니코드·문자 코드: 이모지나 특수문자를 U+1F600처럼 16진수 코드포인트로 나타냅니다.
- 비트 연산·마스크: 0xFF, 0x0F 같은 마스크로 특정 비트만 걸러낼 때 16진수가 직관적입니다.
- 파일 권한(8진법): 리눅스의 chmod 755에서 7=rwx(4+2+1), 5=r-x(4+1)처럼 3비트 묶음을 8진수로 표현합니다.
왜 하필 16과 8인가
16=2⁴, 8=2³으로 둘 다 2의 거듭제곱입니다. 덕분에 2진수와 자릿수 단위로 딱 맞아떨어져 변환에 계산이 필요 없습니다. 반면 10은 2의 거듭제곱이 아니라서 2진수와 깔끔하게 대응하지 않아, 컴퓨터 내부 표현으로는 16·8진법이 선호됩니다.
로마숫자는 진법이 아닙니다
로마숫자(I, V, X, L, C, D, M)는 자릿값 개념이 없는 가산·감산 표기법입니다. 큰 기호부터 늘어놓아 더하되(예: XVI = 10+5+1 = 16), 작은 기호가 큰 기호 앞에 오면 빼는 규칙(예: IV = 5-1 = 4, IX = 10-1 = 9)을 씁니다.
0을 나타내는 기호가 없고 표현할 수 있는 수의 범위도 제한적이어서(전통 표기로 1~3999), 계산보다는 시계 문자판·목차·연도 표기처럼 상징적인 용도로 주로 쓰입니다. 이 변환기도 1~3999 범위만 지원합니다.
| 기호 | 값 | 감산 예시 |
|---|---|---|
| I | 1 | IV = 4, IX = 9 |
| V | 5 | - |
| X | 10 | XL = 40, XC = 90 |
| L | 50 | - |
| C | 100 | CD = 400, CM = 900 |
| D | 500 | - |
| M | 1000 | - |
자주 묻는 질문
- 10진수 255가 왜 16진수로 FF인가요?
- 16진수 각 자리는 16의 거듭제곱을 나타냅니다. FF는 F(15)×16 + F(15)×1 = 240 + 15 = 255입니다. 또한 255는 2진수로 11111111(1이 8개)이므로 1바이트가 표현할 수 있는 최댓값이며, 이를 4자리씩 묶으면 1111(F)·1111(F) = FF가 됩니다.
- 16진법의 A~F는 무슨 뜻인가요?
- 16진법은 한 자리에 열여섯 개의 값(0~15)을 담아야 하는데, 우리가 쓰는 숫자는 0~9까지 열 개뿐입니다. 그래서 10~15를 알파벳 A, B, C, D, E, F로 대신 표기합니다. 즉 A=10, B=11, C=12, D=13, E=14, F=15입니다. 대문자와 소문자는 같은 값으로 취급합니다.
- 8진법은 요즘도 쓰나요?
- 네, 대표적으로 리눅스·유닉스의 파일 권한 설정(chmod)에서 씁니다. rwx(읽기·쓰기·실행) 세 비트를 한 묶음으로 보면 0~7의 값이 되어 8진수 한 자리로 딱 떨어지기 때문입니다. 예를 들어 chmod 755는 소유자에게 rwx(7), 그룹·기타에게 r-x(5) 권한을 준다는 뜻입니다.
- 숫자 앞의 0x, 0b는 무엇인가요?
- 표기가 어떤 진법인지 헷갈리지 않도록 붙이는 접두어입니다. 0x는 16진수(0xFF = 255), 0b는 2진수(0b1010 = 10), 0o 또는 맨 앞의 0은 8진수(0o17 = 15)를 뜻합니다. 접두어가 없으면 보통 10진수로 해석합니다.
- 2진수를 16진수로 빠르게 바꾸는 방법이 있나요?
- 2진수를 오른쪽 끝에서부터 4자리씩 끊어 각 묶음을 16진수 한 자리로 바꾸면 됩니다. 예를 들어 11111101010을 4자리씩 끊으면 111·1110·1010이고, 앞을 0으로 채워 0111(7)·1110(E)·1010(A) = 7EA가 됩니다. 8진수로 바꿀 때는 같은 방식으로 3자리씩 끊습니다.
- 로마숫자로 0이나 4000 이상은 왜 안 되나요?
- 로마숫자에는 0을 나타내는 기호가 없습니다. 또한 전통적인 표기법으로는 M(1000)을 최대 세 번까지만 연달아 쓸 수 있어 3999(MMMCMXCIX)까지만 표현합니다. 4000 이상은 문자 위에 선을 긋는 등 별도 확장 표기가 필요해 이 변환기에서는 지원하지 않습니다.