문자 압축
압축은 필요한 내용을 더 적은 자리에 적어 두도록 표현 방식을 바꾸는 것입니다. 그러면 무엇을 어떻게 바꿔야 짧아지는지가 문제입니다. 답은 데이터의 종류마다 다릅니다. 가장 알아보기 쉬운 문자부터 봅시다.
문자 데이터에서 줄일 거리는 반복입니다. 같은 것이 여러 번 나오면 「무엇이 몇 번」으로 한 번만 적으면 됩니다. 이 방법을 런 렝스 부호화(run-length encoding)라고 합니다. 「런(run)」은 같은 글자가 이어지는 구간을, 「렝스(length)」는 그 길이를 뜻합니다. 부호화는 인코딩(encoding)을 우리말로 옮긴 것이라, 「키워드 인코딩」의 인코딩도 부호화와 같은 말입니다.
부호화한 결과
—
원본
0칸
부호화한 뒤
0칸
압축률
0%
여기서는 글자 하나와 숫자 한 자리를 각각 한 칸으로 세었습니다. 스무 번 이어지면 횟수 「20」이 두 칸입니다. 실제 파일에서 차지하는 자리는 표현 방식에 따라 조금씩 다릅니다.
압축했는데 오히려 커지는 일도 있습니다
「반복이 없는 예」를 눌러 보세요. 압축률이 음수로 나옵니다. 반복이 하나도 없으면 글자마다 「1번」이라고 덧붙이게 되어 길이가 두 배가 되기 때문입니다.
반복이 없는 데이터는 런 렝스 부호화로는 줄일 거리가 없습니다. 압축 방법은 저마다 어떤 데이터를 잘 줄이는지가 정해져 있습니다. 아무 데이터에나 아무 방법을 쓰면 안 되는 까닭이 여기 있습니다.
반복을 줄이는 방법이 런 렝스 부호화 하나뿐인 것은 아닙니다. 무엇을 반복으로 볼 것인지에 따라 방법이 나뉩니다.
런 렝스 부호화
이어서 나오는 같은 글자를 「글자 + 횟수」로 적습니다. 방법이 아주 간단해 빠르지만, 이어지는 부분이 없으면 소용이 없습니다.
키워드 인코딩
자주 나오는 낱말을 짧은 기호 하나로 바꿔 적고, 어느 기호가 어느 낱말인지를 따로 적어 둡니다. 떨어져 있어도 반복이면 줄일 수 있습니다.
허프만 코딩
자주 나오는 글자에 짧은 코드를, 드물게 나오는 글자에 긴 코드를 줍니다. 글자마다 길이가 달라지는 것이 특징입니다.
허프만 코딩이 왜 이득인지 확인해 봅시다
글자를 0과 1로 적는다고 합시다. 세 글자를 구별하려면 보통 글자마다 같은 길이의 코드를 줍니다. 00 · 01 · 10처럼 두 칸씩 주면 열 글자에 20칸이 듭니다. 그런데 A가 다섯 번, B가 두 번, C가 세 번 나온다면 사정이 다릅니다. 가장 자주 나오는 A에게 가장 짧은 코드를 주면 전체 길이가 짧아집니다.
| 글자 | 나온 횟수 | 받은 코드 | 그 글자가 차지하는 길이 |
|---|---|---|---|
| A | 5번 | 0 | 1칸 × 5 = 5칸 |
| C | 3번 | 10 | 2칸 × 3 = 6칸 |
| B | 2번 | 11 | 2칸 × 2 = 4칸 |
A에게 0 대신 11을 주었다면 A만으로 10칸이 되어 전체가 길어집니다. 표대로 주면 모두 15칸으로, 두 칸씩 똑같이 줄 때의 20칸보다 짧습니다. 많이 쓰는 것을 짧게라는 생각은 압축 곳곳에 반복해 나옵니다.
더 알아보기
압축 시뮬레이터의 「허프만 코딩」 탭에서 표와 같은 글 AAAAABBCCC를 「앞으로」 버튼으로 한 단계씩 넘기면, 가장 적게 나온 둘부터 묶어 올라가며 글자마다 코드가 정해지는 과정을 볼 수 있습니다.
런 렝스 부호화 시뮬레이터에 ABABABABAB을 넣어 보세요. 반복이 분명히 있는데도 압축률이 좋지 않습니다. 세 방법 가운데 이런 데이터를 줄일 수 있는 것은 무엇일까요?
이미지 압축
이미지에서 줄일 거리를 찾으려면 먼저 이미지가 어떻게 적혀 있는지를 알아야 합니다.
픽셀(pixel)
디지털 이미지는 아주 작은 네모 점을 가로세로로 빽빽하게 늘어놓아 만듭니다. 이 점 하나가 픽셀입니다. 화면에 얼굴을 아주 가까이 대면 보이는 자잘한 격자가 그것입니다.
압축하지 않은 이미지 하나의 크기는 「점이 몇 개인가」 × 「점 하나를 적는 데 몇 칸이 드는가」입니다. 그러니 줄이는 기본 길은 두 갈래입니다. 점의 수를 줄이거나, 점 하나에 드는 칸을 줄이거나.
GIF — 쓰는 색의 가짓수를 줄인다
이미지에 쓰이는 색을 256가지 안으로 추린 다음, 그 목록을 따로 적어 두고 점마다 「몇 번 색」인지만 적습니다. 색 목록이 짧으니 점 하나에 드는 칸이 줄어듭니다.
추려 낸 뒤로는 고른 색을 그대로 지킵니다. 다만 추리는 동안 밀려난 색은 돌아오지 않습니다. 그래서 원래 색이 아주 많은 사진을 억지로 256가지로 줄이면 결과가 어색해집니다. 이런 까닭에 색이 몇 가지 안 되는 아이콘이나 간단한 그림, 여러 장을 이어 붙인 움직이는 그림에 어울립니다.
JPEG — 눈이 못 알아채는 것을 버린다
사람의 눈은 색이 조금 달라지는 것보다 밝기가 달라지는 것에 훨씬 민감합니다. JPEG은 이 점을 이용해, 눈이 잘 알아채지 못하는 부분을 뭉개거나 지웁니다.
지운 것은 되돌아오지 않으므로 손실입니다. 대신 아주 많이 줄어들고, 얼마나 버릴지를 조절할 수도 있습니다. 색이 많고 부드럽게 이어지는 사진에 어울립니다.
어느 쪽이 더 좋은 기법이 아닙니다
JPEG이 훨씬 많이 줄어드니 늘 나아 보이지만, 색이 몇 가지뿐인 아이콘을 JPEG으로 저장하면 또렷한 경계가 지저분해집니다. 반대로 사진을 GIF으로 저장하면 색이 뭉쳐 얼룩덜룩해집니다. 각 기법은 어떤 이미지를 잘 줄이도록 만들어졌는지가 다를 뿐입니다.
이미지 압축 기법은 이 둘 말고도 여럿 있습니다. 이름을 다 외울 필요는 없고, 「점의 수를 줄이는가, 점 하나의 칸을 줄이는가, 버리는가 지키는가」로 나누어 보는 눈을 갖는 것이 중요합니다.
학교 로고처럼 색이 서너 가지뿐이고 경계가 또렷한 그림은 어느 쪽으로 저장하는 것이 나을까요? 그렇게 생각한 이유를 「점 하나에 드는 칸」으로 설명해 보세요.
소리 압축
소리 데이터는 시간이 흐르면서 공기가 어떻게 떨렸는지를 아주 촘촘히 적어 둔 것입니다. 이미지가 자리에 따라 값이 늘어선 것이라면, 소리는 시간에 따라 값이 늘어선 것입니다. 그래서 줄일 거리도 시간 위에서 찾습니다.
FLAC — 반복되는 흐름을 짧게 적는다
소리가 없는 구간이나 같은 흐름이 반복되는 구간을 짧게 적습니다. 문자에서 반복을 줄이던 것과 같은 생각입니다. 버리는 것이 없으므로 무손실이고, 되돌리면 원본과 똑같습니다.
음질이 그대로인 대신 파일이 큽니다. 음원을 만들거나 편집할 때처럼 원본을 지켜야 하는 곳에 쓰입니다.
MP3 — 귀가 못 듣는 것을 버린다
사람의 귀에는 들리는 범위가 있습니다. 그 범위를 가청 주파수라고 하는데, MP3은 여기서 벗어난 소리를 잘라 냅니다. 또 큰 소리와 겹쳐 어차피 들리지 않는 작은 소리도 함께 버립니다.
버린 것은 되돌아오지 않으므로 손실입니다. 대신 훨씬 작아져 휴대용 기기에 많이 담고 빠르게 주고받을 수 있습니다.
「안 들린다」는 사람 귀 이야기입니다
MP3이 버리는 소리는 데이터로는 분명히 있었던 값입니다. 다만 사람이 그것을 못 듣기 때문에 버려도 된다고 판단한 것입니다. 그러니 「없어도 되는 소리를 버린다」가 아니라 「사람 귀 기준으로 티가 안 나는 것을 버린다」가 정확한 말입니다.
이 구별이 중요한 까닭은, 사람이 듣는 것이 목적이 아닐 때는 이 판단이 어긋나기 때문입니다. 기계가 소리를 분석해 무언가를 알아내야 한다면, 사람 귀에 안 들리는 부분이 바로 필요한 값일 수도 있습니다.
고래의 울음소리를 녹음해 연구에 쓰려고 합니다. MP3으로 저장하면 곤란할 수 있는 까닭을 「안 들린다」가 사람 귀 기준이라는 점으로 설명해 보세요.
두 갈래로 정리
세 유형을 따로따로 보았지만, 나온 방법들을 늘어놓고 보면 결국 두 가지밖에 없습니다. 기법의 이름을 외우는 대신 이 두 갈래를 손에 쥐면, 처음 보는 압축 방식도 어느 쪽인지 가늠할 수 있습니다.
갈래 1 — 반복을 짧게 적는다
같은 것이 여러 번 나오면 한 번만 적고 「몇 번」을 덧붙입니다. 자주 나오는 것에 짧은 표현을 줍니다. 버리는 것이 없으므로 무손실입니다.
반복이 적은 데이터에서는 줄어들지 않거나 오히려 커집니다.
갈래 2 — 사람이 못 알아채는 것을 버린다
눈이 못 보는 색 차이, 귀가 못 듣는 소리를 지웁니다. 버린 것은 되돌아오지 않으므로 손실입니다.
훨씬 많이 줄어들지만, 사람이 보고 듣는 것이 목적일 때만 쓸 수 있습니다.
| 유형 | 기법 | 갈래 | 무엇을 줄이는가 |
|---|---|---|---|
| 문자 | 런 렝스 부호화 | 반복 | 이어지는 같은 글자를 「글자 + 횟수」로 |
| 문자 | 키워드 인코딩 | 반복 | 자주 나오는 낱말을 짧은 기호 하나로 |
| 문자 | 허프만 코딩 | 반복 | 자주 나오는 글자에 짧은 코드를 |
| 이미지 | GIF | 반복 + 버리기 | 색을 추려 점 하나에 드는 칸을 |
| 이미지 | JPEG | 버리기 | 눈이 못 알아채는 색 차이를 |
| 소리 | FLAC | 반복 | 반복되는 소리의 흐름을 |
| 소리 | MP3 | 버리기 | 귀가 못 듣는 소리 성분을 |
「반복」 갈래는 무손실, 「버리기」 갈래는 손실입니다
표의 갈래 칸을 보면 「반복」과 무손실, 「버리기」와 손실이 겹칩니다. 반복을 짧게 적는 것은 적는 방식만 바꾸는 일이라 되돌리면 똑같아지고, 버리는 것은 내용 자체를 덜어 내는 일이라 되돌릴 것이 없습니다. 압축을 「반복되는 부분을 짧게 적거나, 없어도 되는 부분을 덜어 내는 것」으로 보면, 두 갈래는 이 문장의 두 부분에 해당합니다.
실제 파일 형식은 두 갈래를 함께 쓰기도 합니다. 먼저 사람이 못 알아채는 것을 버려서 크게 줄인 다음, 남은 것에서 반복을 다시 짧게 적는 식입니다. 표의 GIF이 그런 경우입니다. 쓰는 색을 256가지로 추리는 동안은 버리는 일이고, 추리고 난 뒤 점마다 번호를 적을 때 같은 번호의 배열이 반복되는 부분을 짧게 적는 것은 반복을 짧게 적는 일입니다. 그래서 색이 처음부터 256가지 이하인 아이콘은 하나도 잃지 않지만, 색이 많은 사진을 GIF으로 저장하면 추리는 단계에서 이미 잃습니다. JPEG과 MP3도 버린 뒤 남은 것을 다시 짧게 적지만, 크게 줄이는 쪽이 버리기라 표에는 그 갈래만 적었습니다. 두 갈래는 둘 중 하나를 고르는 것이 아니라 겹쳐 쓸 수 있는 도구입니다.
동영상은 「거의 같은 그림이 1초에 수십 장 이어지는 것」입니다. 두 갈래 가운데 어느 쪽을 쓰면 크게 줄일 수 있을까요? 그리고 나머지 한 갈래도 함께 쓸 수 있을까요?
핵심 정리
문자 압축
- 런 렝스 부호화는 이어지는 같은 글자를 「글자 + 횟수」로 적는다.
- 반복이 없으면 오히려 길어진다. 압축이 늘 이득인 것은 아니다.
- 키워드 인코딩은 자주 나오는 낱말을, 허프만 코딩은 자주 나오는 글자를 짧게 적는다.
이미지 압축
- 압축하지 않은 이미지의 크기는 「점의 수」 × 「점 하나에 드는 칸」이므로 줄이는 길도 두 갈래다.
- GIF은 색을 추려 점 하나의 칸을 줄이고, JPEG은 눈이 못 알아채는 것을 버린다.
- GIF은 두 갈래를 겹쳐 쓴다. 색을 추리는 동안은 버리는 일이라, 색이 많은 사진에서는 되돌아오지 않는다.
- 어느 쪽이 더 좋은 기법이 아니라, 잘 줄이는 이미지가 서로 다르다.
소리 압축
- 소리는 시간에 따라 값이 늘어선 것이라 줄일 거리도 시간 위에서 찾는다.
- FLAC은 반복되는 흐름을 짧게 적고, MP3은 귀가 못 듣는 소리를 버린다.
- 「안 들린다」는 사람 귀 기준이다. 사람이 듣는 것이 목적이 아니면 이 판단이 어긋난다.
두 갈래
- 이 차시의 기법은 반복을 짧게 적기(무손실)와 사람이 못 알아채는 것 버리기(손실) 두 갈래로 나뉜다.
- 두 갈래는 고르는 것이 아니라 겹쳐 쓸 수 있는 도구다.
확인 퀴즈
배운 내용을 확인해 봅시다.
WWWWWWBBWWW을 런 렝스 부호화하면?
런 렝스 부호화를 했더니 원본보다 길어졌습니다. 가장 그럴듯한 까닭은?
MP3이 소리를 크게 줄일 수 있는 까닭으로 알맞은 것은?
이 차시에 나온 기법들을 두 갈래로 나누었을 때, 「반복을 짧게 적는」 갈래에 들어가지 않는 것은?