바이트, 십육진수, 글자
글자 A는 65, 이진수로 01000001로 저장됩니다. UTF-8에서 한글 음절 「한」은 3바이트를 차지합니다.
생활 속 수수께끼부터 하나 풀어 보겠습니다. (지어낸 예입니다.) 단톡방에 한 친구는 「한국어」라고 세 글자를 보내고, 다른 친구는 영어로 Korean이라고 여섯 글자를 보냅니다. 어느 메시지가 더 클까요? 짐작과 다를 가능성이 높습니다. 글자 수는 영어가 두 배인데, UTF-8로 저장하면 Korean은 6바이트, 「한국어」는 9바이트입니다. 한글은 한 글자에 3바이트씩 들기 때문입니다. UTF-8을 정한 표준 문서 RFC 3629에도 이 낱말이 예로 실려 있고, 바이트가 ED 95 9C EA B5 AD EC 96 B4로 적혀 있습니다. 이 차이를 이해하려면 두 가지가 필요합니다. 바이트를 짧게 적는 방법, 그리고 글자를 수로 바꾸는 약속입니다.
바이트 하나는 십육진수 두 자리
ED, 95 같은 두 글자짜리 묶음이 십육진수(hexadecimal, 줄여서 hex)입니다. 0과 1이 길게 이어지면 사람 눈으로 읽기 힘들어서 프로그래머들은 이렇게 줄여 적습니다. 십육진수에는 숫자가 열여섯 개 있습니다. 0부터 9까지는 그대로 쓰고, 10부터 15까지는 A부터 F까지의 글자를 씁니다. 십육진수 한 자리가 정확히 네 비트를 나타내므로 바이트 하나는 언제나 두 자리로 적힙니다. 01000001을 네 비트씩 끊으면 0100과 0001이 되고, 각각 4와 1이니 이 바이트는 0x41입니다. 앞의 0x는 「이것은 십육진수」라는 표시일 뿐입니다. 십진수로 바꾸면 4 × 16 + 1 = 65입니다. 자리가 하나 왼쪽으로 갈 때마다 16배가 되므로 앞자리 4에 16을 곱합니다.
십육진수는 이미 본 적이 있을 가능성이 높습니다. 웹 페이지의 색은 흔히 #RRGGBB로 적는데, 빨강, 초록, 파랑 빛의 세기를 바이트 하나씩, 모두 세 바이트로 나타낸 것입니다(MDN). 미술 수행평가로 웹 페이지를 꾸밀 때 색 고르는 칸에 나오는 그 숫자입니다. #FF0000은 첫 바이트가 255이고 나머지 둘이 0이라 빨강만 가득 켠 색이고, #FFFFFF는 흰색입니다. 바이트에 담을 수 있는 가장 큰 값 11111111은 0xFF이고, 0xFF = 15 × 16 + 15 = 255입니다.
A가 65인 것은 그렇게 약속했기 때문입니다
컴퓨터는 글자가 무엇인지 모릅니다. 수를 저장할 뿐이고, 어떤 수가 어떤 글자인지는 사람들이 미리 정해 둡니다. 초기 네트워크에서 쓴 약속이 ASCII이고, 1969년 RFC 20이 아파넷(ARPANET)에서 쓰도록 이 약속을 정리했습니다. ASCII는 글자 하나에 7비트를 쓰니 코드가 128개입니다. 대문자 A는 65, B는 66, 이렇게 차례로 이어져서 Z는 90입니다. 소문자 a는 97로 A보다 딱 32 큽니다. 이진수로 보면 32 자리 비트 하나만 다릅니다. 숫자도 글자로 쓰일 때는 코드가 따로 있습니다. 글자 「0」은 48이라서 글자 「7」은 수 7이 아니라 55로 저장됩니다.
끌어서 돌리고, 휠이나 두 손가락으로 확대하세요.
한글 한 글자에 3바이트가 드는 까닭
코드 128개면 영어에는 넉넉하지만 한국어, 아랍어, 중국어, 이모지에는 턱없이 모자랍니다. 유니코드(Unicode)는 세계 여러 문자의 글자 하나하나에 번호를 붙였습니다. 이 번호를 코드 포인트라고 하고, U+10FFFF까지 있습니다. 그 번호를 바이트로 바꾸는 가장 흔한 방법이 UTF-8(RFC 3629)이고, 글자 하나에 1바이트부터 4바이트까지 씁니다. ASCII의 128글자는 예전 1바이트 코드를 그대로 쓰기 때문에, 영어만 있는 글은 ASCII로 저장하든 UTF-8로 저장하든 바이트가 똑같습니다. RFC 3629의 표를 보면 U+0800부터 U+FFFF까지는 모두 3바이트 줄에 들어가는데, 한글 음절이 바로 이 범위에 있습니다. 영어 알파벳은 그보다 앞쪽, 1바이트 줄에 들어갑니다. 그래서 é는 2바이트, 「한」은 3바이트, 😀는 4바이트입니다. 첫 바이트가 길이를 알려 준다는 것도 재미있습니다. 「한」의 첫 바이트 ED는 이진수로 11101101이고, 맨 앞의 1 세 개가 「이 글자는 3바이트짜리」라는 표시입니다.
| 글자 | 코드 포인트 | UTF-8 바이트(십육진수) | 바이트 수 |
|---|---|---|---|
| A | U+0041 | 41 | 1 |
| a | U+0061 | 61 | 1 |
| é | U+00E9 | C3 A9 | 2 |
| 한 | U+D55C | ED 95 9C | 3 |
| 😀 | U+1F600 | F0 9F 98 80 | 4 |
글자가 깨지는 것은 바이트를 엉뚱한 약속으로 읽었기 때문입니다
텍스트 파일은 이런 바이트를 한 줄로 늘어놓은 것이고, 그 밖에 다른 것은 들어 있지 않습니다. Hello를 UTF-8로 저장하면 5바이트가 되고, 십육진수로 48 65 6C 6C 6F, 십진수로 72, 101, 108, 108, 111입니다. 가운데 l 두 개는 같은 바이트가 두 번 이어서 나옵니다. 단톡방에서 받은 수행평가 안내 파일을 열었더니 한글이 알아볼 수 없는 기호로 가득하다고 해 봅시다(지어낸 예입니다). 대개 UTF-8로 저장한 파일을 옛 한국어나 일본어 인코딩으로 열었거나, 그 반대인 경우입니다. 프로그램이 같은 바이트를 다른 약속으로 읽어서 엉뚱한 글자를 보여 줄 뿐, 파일 안의 바이트는 하나도 망가지지 않았습니다. 인코딩을 UTF-8로 바꿔 다시 열면 글자가 제대로 돌아옵니다.
사라진 34 GB는 어디로 갔을까
2의 10제곱 1024가 1000에 가깝다 보니 사람들은 오랫동안 둘 다 「킬로바이트」라고 불렀습니다. 1998년 12월 IEC가 둘을 가르는 이름을 따로 승인했고, NIST가 그 이름을 정리해 두었습니다. 1 kB는 1000바이트이고 1 KiB(키비바이트)는 1024바이트입니다. 1 MB는 1,000,000바이트이고 1 MiB는 1,048,576바이트입니다. 저장 장치 회사는 10의 거듭제곱으로 용량을 셉니다. 500 GB짜리 SSD를 산 친구가 「34 GB가 어디 갔지?」 하고 묻는 장면을 떠올려 보세요(지어낸 예입니다). 그 드라이브에는 500,000,000,000바이트가 들어 있고, 2의 거듭제곱으로 세는 운영체제는 이것을 1,073,741,824로 나눠 약 465.66 GiB로 보여 줍니다. 차이 34는 원래 없던 용량이 아니라 단위가 달라서 생긴 숫자입니다. 바이트는 하나도 사라지지 않았습니다. 단위가 커질수록 차이도 벌어집니다. 1 KiB는 1 kB보다 2.4% 크지만, 1 GiB는 1 GB보다 약 7.4% 큽니다.
- 「1 KB는 어디서나 정확히 1000바이트다.」 표준으로는 kB가 1000바이트, 1024바이트는 KiB입니다. 하지만 실제로는 옛 이름을 두 뜻으로 섞어 씁니다. NIST도 메모리 회사는 메가바이트를 2²⁰바이트로, 저장 장치 회사는 1,000,000바이트로 쓰는 경우가 많고, 예전 「1.44 MB」 플로피 디스크는 1,024,000바이트짜리 세 번째 메가바이트를 썼다고 적어 두었습니다. 정확한 크기가 중요할 때는 KiB, MiB, GiB처럼 i가 붙었는지 확인하세요. 상자에 적힌 용량과 컴퓨터 화면의 숫자가 다를 때도 대개 이 때문입니다.
- 「500 GB 드라이브인데 34 GB가 비어서 왔다.」 500,000,000,000바이트 ÷ 1,073,741,824 ≈ 465.66 GiB입니다. 바이트는 같고 단위만 다릅니다. 500 − 465.66 ≈ 34.34이고, 이 차이가 「사라진」 34의 정체입니다.
- 「글자 하나는 언제나 1바이트다.」 UTF-8에서 1바이트인 것은 ASCII 128글자뿐입니다. é는 2바이트, 한글 음절은 3바이트, 😀는 4바이트입니다. 그래서 바이트로 길이를 세는 칸은 한글로 채우면 영어보다 세 배쯤 빨리 찹니다. 글자 수를 세는 칸인지 바이트를 세는 칸인지 먼저 확인해야 합니다.
- 「글자 7은 수 7로 저장된다.」 글자 「7」의 코드는 55, 이진수로 00110111입니다. 글에서 읽은 「7」로 계산을 하려면 프로그램이 먼저 수 7로 바꿔야 합니다. 글자 「7」 두 개를 그냥 이어 붙이면 「77」이 되고, 수로 바꿔 더해야 14가 나옵니다.
- 0x41은 십진수로 얼마입니까?
- 0xFF는 십진수로 얼마입니까?
- 십육진수 한 자리는 몇 비트를 나타냅니까?
- ASCII에서 A는 65입니다. C는 몇입니까?
- a의 코드는 A의 코드보다 얼마나 큽니까?
- 7비트 ASCII에는 코드가 몇 개 있습니까?
- UTF-8에서 음절 「한」은 몇 바이트입니까?
- 01000010으로 저장되는 글자는 무엇입니까?
- B
- A
- b
- 2
- 1 MiB는 몇 바이트입니까?
- 드라이브에 500,000,000,000바이트가 들어 있습니다. 약 몇 GiB입니까? (소수 첫째 자리까지)
- 십육진수 한 자리는 4비트, 바이트는 두 자리(0x00~0xFF)입니다.
- ASCII: A = 65, a = 97, 0 = 48. 7비트에 코드 128개.
- UTF-8은 글자마다 1~4바이트를 쓰고, ASCII 글은 그대로입니다.
- 1 kB = 1000 B, 1 KiB = 1024 B, 1 MiB = 1,048,576 B.
이 과정의 출처 (9)
- (checked 2026-10-17; reordered 2026-10-19: standards first, then official documentation, then the teaching model and calculations, history sources last)
- Standards: NIST, "Prefixes for binary multiples" (physics.nist.gov/cuu/Units/binary.html: IEC approved kibi, mebi, gibi in December 1998; 1 B = 8 bit; 1 MiB = 1 048 576 B; 1 MB = 1 000 000 B; 1 GiB = 1 073 741 824 B; historical note: memory makers usually mean 2²⁰ bytes by megabyte, storage makers 1 000 000, and the "1.44 MB" diskette uses a megabyte of 1 024 000 bytes)
- IETF RFC 20 "ASCII format for Network Interchange" (1969, 7-bit codes, A = 65, a = 97, 0 = 48)
- IETF RFC 3629 "UTF-8, a transformation format of ISO 10646" (2003: 1 to 4 octets per character, ASCII unchanged, code points up to U+10FFFF, U+0800 to U+FFFF take three octets, "the first octet of a multi-octet sequence indicates the number of octets", example U+D55C U+AD6D U+C5B4 = ED 95 9C EA B5 AD EC 96 B4)
- Official documentation: MDN Web Docs, "<color>" (hexadecimal colour notation #RRGGBB)
- Intel, "Intel Chips" timeline poster (2012: Intel 4004 of 1971 with 2,300 transistors; 2nd generation Core 2010 with 1.16 billion)
- Claude E. Shannon, "A Symbolic Analysis of Relay and Switching Circuits", Transactions of the AIEE vol. 57 (1938)
- abstract of his MIT master's thesis. Computer History Museum, The Silicon Engine, "1947: Invention of the Point-Contact Transistor" (Bardeen and Brattain, December 1947, germanium)
- John von Neumann, "First Draft of a Report on the EDVAC" (30 June 1945, Moore School, reprinted in IEEE Annals of the History of Computing 15:4, 1993).
확인한 날: 2026-10-17