2. 텍스트의 변신과 압축: 유니코드와 struct

우리가 키보드로 친 “안녕”이라는 예쁜 글씨들. 사실 기계 안에서는 이리저리 코드가 쪼개지고 숫자로 변신하며 돌아다니고 있습니다. 그 신비한 변신의 세계를 슬쩍 들여다보죠!

2.1 문자들의 전 세계 공용어: 유니코드

“A”는 숫자 65번, “B”는 66번. 옛날에는 이렇게 영어를 숫자로 바꿨지만, 한글이나 이모지(😀)는 어떻게 할까요? 전 세계 사람들이 회의를 해서 “지구상의 모든 문자에 고유한 숫자(코드)를 부여하자!”라고 만든 거대한 사전이 바로 유니코드(Unicode)입니다.

파이썬의 글자들은 기본적으로 이 유니코드 사전의 번호표를 당당히 달고 있습니다.

하지만 이 글자들을 컴퓨터 하드웨어나 인터넷 선에 밀어 넣으려면 더 잘게, 0과 1로 된 ‘바이트(Byte)’ 스트림 가루로 빻아야 합니다. 이걸 인코딩(Encoding)이라고 부릅니다. 가장 유명한 인코딩 규칙이 바로 UTF-8입니다!

my_word = "파이썬!"

# 유니코드를 마법의 가루통(UTF-8)에 넣고 바이트(기계어)로 빻기! (인코딩)
machine_code = my_word.encode('utf-8')
print("기계어 변신:", machine_code)
# 출력: b'\xed\x8c\x8c\xec\x9d\xb4\xec\x8d\xac!' (사람이 읽을 수 없음)

# 이 기계어를 가져와 다시 사람이 읽을 수 있는 유니코드로 조립! (디코딩)
human_code = machine_code.decode('utf-8')
print("사람 말로 복구:", human_code)
# 출력: 파이썬!

2.2 부품들을 압축 포장하는 공장: struct 모듈

가끔 “정수 1, 2, 3을 가장 작은 바이트 박스에 빈틈없이 구겨 넣어서 다른 컴퓨터로 전송하라!”는 명령이 떨어집니다. 이럴 때 자르고 붙이는 포장 공장 역할을 하는 것이 struct 모듈입니다.

import struct

# 'hhl' 이 암호는 설계도(Format String)입니다. 
# h는 작은 상자(2바이트 정수), l은 큰 상자(4바이트 정수)입니다.
# 즉 "작은 상자 2개, 큰 상자 1개"로 포장하라는 뜻!

# 1, 2, 3 이라는 데이터를 진짜로 포장(packing)합니다.
packed_data = struct.pack('hhl', 1, 2, 3)

print("포장 완료:", packed_data)
# 출력: b'\x01\x00\x02\x00\x03\x00\x00\x00\x00\x00\x00\x00' (전기 신호들)

# 이 찌그러진 박스를 받아서 다시 원래 모습으로 뜯어내기! (unpacking)
unpacked_data = struct.unpack('hhl', packed_data)

print("박스 뜯기 완료:", unpacked_data)
# 출력: (1, 2, 3)

게임에서 아주 적은 데이터로 플레이어의 좌표, 체력, 마나 등을 동시에 포장해서 인터넷으로 휙 쏴버릴 때 아주 유용하게 쓰이는 고급 스킬입니다!

서브목차