edubun
한국어

바이트, 십육진수, 글자

글자 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로 저장됩니다.

불러오는 중

끌어서 돌리고, 휠이나 두 손가락으로 확대하세요.

스위치가 01000001, 글자 A를 보여 줍니다. 메뉴에서 다른 글자를 골라 패턴을 보거나, 32 자리 스위치를 눌러 대문자와 소문자 사이를 오가 보세요.

한글 한 글자에 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 바이트(십육진수)바이트 수
AU+0041411
aU+0061611
éU+00E9C3 A92
한U+D55CED 95 9C3
😀U+1F600F0 9F 98 804

글자가 깨지는 것은 바이트를 엉뚱한 약속으로 읽었기 때문입니다

텍스트 파일은 이런 바이트를 한 줄로 늘어놓은 것이고, 그 밖에 다른 것은 들어 있지 않습니다. 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가 나옵니다.
선생님 메모정의부터 말하지 말고 종이에 바이트를 적는 데서 시작하세요. Hello를 쓰고 ASCII 표에서 다섯 글자의 코드를 같이 찾은 다음에 십육진수를 보여 줍니다. 학생들이 가장 많이 막히는 곳이 십육진수입니다. 바이트를 8비트로 쓰고 가운데에 세로줄을 그은 뒤, 왼쪽 반과 오른쪽 반을 각각 한 자리로 바꾸게 하세요. 옆에 「10 = A … 15 = F」 쪽지를 붙여 두면 훨씬 빨라집니다. A와 a 사이의 32는 장면에서 32 자리 스위치 하나를 눌러 보게 하면 금방 기억합니다. 컴퓨터가 있다면 영어 한 줄과 한글 한 줄을 UTF-8 텍스트 파일로 저장해 파일 크기를 비교해 보게 하세요. 「글자 수가 같은데 왜 크기가 다르지?」라는 질문이 나오면 UTF-8 설명으로 바로 넘어가면 됩니다.
  1. 0x41은 십진수로 얼마입니까?
  2. 0xFF는 십진수로 얼마입니까?
  3. 십육진수 한 자리는 몇 비트를 나타냅니까?
  4. ASCII에서 A는 65입니다. C는 몇입니까?
  5. a의 코드는 A의 코드보다 얼마나 큽니까?
  6. 7비트 ASCII에는 코드가 몇 개 있습니까?
  7. UTF-8에서 음절 「한」은 몇 바이트입니까?
  8. 01000010으로 저장되는 글자는 무엇입니까?
    • B
    • A
    • b
    • 2
  9. 1 MiB는 몇 바이트입니까?
  10. 드라이브에 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