Deflate 알고리즘 (Gzip, zlib)
1. 개요
데이터 압축은 저장 공간 절약과 네트워크 전송 속도 향상을 위해 필수적인 기술입니다. Deflate 알고리즘은 이러한 목적을 위해 설계된 대표적인 압축 알고리즘 중 하나로, Gzip과 zlib 같은 다양한 압축 포맷에서 사용됩니다. 본 글에서는 Deflate 알고리즘의 개념과 Gzip 및 zlib과의 관계를 설명하고, Java와 C를 이용한 구현 예제를 소개하겠습니다.
2. Deflate 알고리즘이란?
Deflate는 1993년 Phil Katz에 의해 개발된 압축 알고리즘으로, 다음 두 가지 주요 기술을 조합하여 높은 압축률과 빠른 처리 속도를 제공합니다.
- LZ77(Lempel-Ziv 1977) 압축: 중복된 문자열을 참조하여 데이터를 효율적으로 저장합니다.
- Huffman 코딩: 데이터의 빈도수에 따라 가변 길이의 코드로 인코딩하여 압축합니다.
Deflate는 특허 문제 없이 누구나 자유롭게 사용할 수 있도록 설계되었으며, 현재 ZIP, PNG, HTTP 압축 등 다양한 곳에서 활용되고 있습니다.
3. Gzip과 zlib
Deflate는 기본적인 압축 알고리즘이며, 이를 기반으로 여러 파일 포맷이 개발되었습니다. 그중 대표적인 것이 Gzip과 zlib입니다.
3.1 Gzip
- Gzip은 GNU 프로젝트에서 개발한 파일 압축 포맷으로, Deflate 알고리즘을 기반으로 합니다.
- 주로
.gz
확장자로 저장되며, 하나의 파일을 압축하는 데 사용됩니다. - 파일 헤더와 체크섬을 포함하여 데이터의 무결성을 보장합니다.
3.2 zlib
- zlib은 Deflate를 기반으로 한 압축 라이브러리이며, 다양한 소프트웨어에서 사용됩니다.
- Gzip과 달리 데이터 스트림 단위로 압축을 수행하며, 네트워크 전송 및 임베디드 환경에서 자주 사용됩니다.
.zlib
확장자를 사용하지 않고, 주로 다른 포맷과 함께 활용됩니다.
4. Java를 이용한 Deflate 압축 및 해제
Java에서는 java.util.zip
패키지를 이용하여 Deflate, Gzip, zlib을 다룰 수 있습니다.
4.1 Deflate 압축 및 해제 예제 (Java)
import java.io.*;
import java.util.zip.*;
public class DeflateExample {
public static void main(String[] args) throws IOException {
String originalData = "Hello, Deflate Compression!";
byte[] compressedData = compress(originalData);
String decompressedData = decompress(compressedData);
System.out.println("Original: " + originalData);
System.out.println("Decompressed: " + decompressedData);
}
public static byte[] compress(String data) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
Deflater deflater = new Deflater();
DeflaterOutputStream deflaterStream = new DeflaterOutputStream(byteStream, deflater);
deflaterStream.write(data.getBytes());
deflaterStream.close();
return byteStream.toByteArray();
}
public static String decompress(byte[] compressedData) throws IOException {
ByteArrayInputStream byteStream = new ByteArrayInputStream(compressedData);
Inflater inflater = new Inflater();
InflaterInputStream inflaterStream = new InflaterInputStream(byteStream, inflater);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inflaterStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
return outputStream.toString();
}
}
위 코드는 DeflaterOutputStream
과 InflaterInputStream
을 이용하여 문자열을 압축 및 해제하는 예제입니다.
5. C를 이용한 zlib 압축 및 해제
C에서는 zlib 라이브러리를 이용하여 Deflate 압축 및 해제를 수행할 수 있습니다. 먼저 zlib가 설치되어 있어야 하며, 관련 헤더 파일을 포함해야 합니다.
5.1 zlib 압축 및 해제 예제 (C)
#include <stdio.h>
#include <string.h>
#include <zlib.h>
#define CHUNK 256
void compress_data(const char *data, size_t data_len, unsigned char *compressed, size_t *compressed_len) {
z_stream strm = {0};
deflateInit(&strm, Z_BEST_COMPRESSION);
strm.next_in = (Bytef *)data;
strm.avail_in = data_len;
strm.next_out = compressed;
strm.avail_out = CHUNK;
deflate(&strm, Z_FINISH);
deflateEnd(&strm);
*compressed_len = CHUNK - strm.avail_out;
}
void decompress_data(unsigned char *compressed, size_t compressed_len, char *decompressed, size_t decompressed_len) {
z_stream strm = {0};
inflateInit(&strm);
strm.next_in = compressed;
strm.avail_in = compressed_len;
strm.next_out = (Bytef *)decompressed;
strm.avail_out = decompressed_len;
inflate(&strm, Z_FINISH);
inflateEnd(&strm);
}
int main() {
const char *original = "Hello, zlib compression!";
unsigned char compressed[CHUNK];
size_t compressed_len;
char decompressed[CHUNK];
compress_data(original, strlen(original), compressed, &compressed_len);
decompress_data(compressed, compressed_len, decompressed, CHUNK);
printf("Original: %s\n", original);
printf("Decompressed: %s\n", decompressed);
return 0;
}
위 코드는 deflate()
와 inflate()
함수를 이용하여 데이터를 압축하고 해제하는 예제입니다. 압축률을 높이기 위해 Z_BEST_COMPRESSION
옵션을 사용하였습니다.
6. 마무리
Deflate 알고리즘은 LZ77과 Huffman 코딩을 결합하여 높은 압축률을 제공합니다. Gzip과 zlib은 Deflate를 활용하여 각각 파일 압축과 스트림 압축을 수행하는 포맷 및 라이브러리입니다. Java에서는 DeflaterOutputStream
과 InflaterInputStream
을 이용하고, C에서는 zlib
라이브러리를 활용하여 압축 및 해제를 수행할 수 있습니다. Deflate를 활용한 압축 방식은 파일 저장, 네트워크 전송 등 다양한 환경에서 유용하게 사용될 수 있습니다.
'압축 알고리즘(Compression Algorithm)' 카테고리의 다른 글
Brotli 압축 알고리즘 (0) | 2025.03.16 |
---|---|
Bzip2 압축 알고리즘 (0) | 2025.03.15 |
MP3 (오디오 압축) (0) | 2025.03.13 |
JPEG 압축 (DCT 기반 압축) (0) | 2025.03.12 |
Arithmetic Coding (0) | 2025.03.11 |