압축 알고리즘(Compression Algorithm)

Deflate 알고리즘 (Gzip, zlib)

임베디드 친구 2025. 3. 14. 09:45
728x90
반응형

Deflate 알고리즘 (Gzip, zlib)

1. 개요

데이터 압축은 저장 공간 절약과 네트워크 전송 속도 향상을 위해 필수적인 기술입니다. Deflate 알고리즘은 이러한 목적을 위해 설계된 대표적인 압축 알고리즘 중 하나로, Gzip과 zlib 같은 다양한 압축 포맷에서 사용됩니다. 본 글에서는 Deflate 알고리즘의 개념과 Gzip 및 zlib과의 관계를 설명하고, Java와 C를 이용한 구현 예제를 소개하겠습니다.

2. Deflate 알고리즘이란?

Deflate는 1993년 Phil Katz에 의해 개발된 압축 알고리즘으로, 다음 두 가지 주요 기술을 조합하여 높은 압축률과 빠른 처리 속도를 제공합니다.

  1. LZ77(Lempel-Ziv 1977) 압축: 중복된 문자열을 참조하여 데이터를 효율적으로 저장합니다.
  2. 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();
    }
}

위 코드는 DeflaterOutputStreamInflaterInputStream을 이용하여 문자열을 압축 및 해제하는 예제입니다.

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에서는 DeflaterOutputStreamInflaterInputStream을 이용하고, 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