압축 알고리즘(Compression Algorithm)

무손실 압축과 손실 압축의 차이

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

무손실 압축과 손실 압축의 차이

데이터 압축은 한정된 저장 공간을 효율적으로 사용하고, 데이터 전송 속도를 높이기 위해 중요한 기술입니다. 데이터 압축은 크게 무손실 압축(Lossless Compression)과 손실 압축(Lossy Compression)으로 나뉘며, 각각의 방식은 데이터의 특성과 목적에 따라 선택됩니다. 본 포스팅에서는 무손실 압축과 손실 압축의 차이를 설명하고, 각 방식의 대표적인 알고리즘과 구현 예제를 제공합니다.

1. 무손실 압축(Lossless Compression)

무손실 압축은 원본 데이터를 손상시키지 않고 압축하는 방식입니다. 압축된 데이터를 복원하면 원본과 동일한 데이터가 생성됩니다. 이 방식은 파일 크기를 줄이면서도 데이터의 정확성이 중요한 경우에 사용됩니다. 대표적인 사용 사례로는 텍스트 파일, 실행 파일, 금융 데이터, 소스 코드 등이 있습니다.

1.1 무손실 압축 알고리즘

1.1.1 허프만 코딩(Huffman Coding)

허프만 코딩은 빈도수가 높은 데이터를 짧은 비트로 표현하여 전체 크기를 줄이는 방식입니다. 트리 구조를 사용하여 최적의 접두 코드(prefix code)를 생성하는 것이 특징입니다.

1.1.2 LZ77 & LZ78

LZ77과 LZ78은 반복되는 패턴을 사전(dictionary) 기반으로 압축하는 알고리즘입니다. ZIP, GZIP, PNG 등에서 사용됩니다.

1.1.3 DEFLATE

DEFLATE는 허프만 코딩과 LZ77을 결합한 압축 방식으로, ZIP 및 GZIP 파일 포맷에서 사용됩니다.

1.2 무손실 압축의 장점과 단점

장점:

  • 데이터 손실이 없으므로 중요한 정보(예: 금융 데이터, 실행 파일)를 안전하게 보관 가능
  • 데이터 원본을 정확히 복원 가능

단점:

  • 압축률이 제한적이며, 손실 압축보다 압축 효율이 낮을 수 있음
  • 일부 파일에서는 압축률이 거의 발생하지 않을 수 있음

1.3 Java를 이용한 허프만 코딩 예제

import java.util.*;

class HuffmanNode {
    int frequency;
    char character;
    HuffmanNode left, right;
}

class HuffmanComparator implements Comparator<HuffmanNode> {
    public int compare(HuffmanNode x, HuffmanNode y) {
        return x.frequency - y.frequency;
    }
}

public class HuffmanCoding {
    public static void main(String[] args) {
        String text = "hello huffman";
        Map<Character, Integer> frequencyMap = new HashMap<>();
        for (char c : text.toCharArray()) {
            frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
        }

        PriorityQueue<HuffmanNode> queue = new PriorityQueue<>(new HuffmanComparator());
        for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {
            HuffmanNode node = new HuffmanNode();
            node.character = entry.getKey();
            node.frequency = entry.getValue();
            queue.add(node);
        }

        while (queue.size() > 1) {
            HuffmanNode left = queue.poll();
            HuffmanNode right = queue.poll();
            HuffmanNode parent = new HuffmanNode();
            parent.frequency = left.frequency + right.frequency;
            parent.left = left;
            parent.right = right;
            queue.add(parent);
        }
    }
}

2. 손실 압축(Lossy Compression)

손실 압축은 데이터의 일부를 제거하여 압축률을 극대화하는 방식입니다. 압축 후 원본과 완전히 동일한 데이터를 복원할 수는 없지만, 사람이 인지하기 어려운 차이를 이용하여 효과적으로 용량을 줄입니다. 대표적인 사용 사례로는 이미지, 오디오, 비디오 압축 등이 있습니다.

2.1 손실 압축 알고리즘

2.1.1 JPEG 압축

JPEG는 이미지 압축에 널리 사용되는 포맷으로, DCT(이산 코사인 변환)와 양자화를 이용하여 불필요한 정보를 제거합니다.

2.1.2 MP3 압축

MP3는 오디오 압축 기술로, 인간이 듣기 어려운 주파수 대역을 제거하는 방식으로 용량을 줄입니다.

2.1.3 MPEG 비디오 압축

MPEG는 동영상 압축 기술로, 프레임 간의 차이를 이용하여 중복 데이터를 제거합니다.

2.2 손실 압축의 장점과 단점

장점:

  • 높은 압축률을 제공하며, 파일 크기를 획기적으로 줄일 수 있음
  • 멀티미디어 데이터(이미지, 오디오, 비디오)에서 용량 대비 높은 품질 유지 가능

단점:

  • 원본 데이터의 일부가 손실되므로 완전한 복원이 불가능
  • 품질이 낮아질 경우 시각적/청각적 아티팩트(손실 흔적)가 발생할 수 있음

2.3 C를 이용한 JPEG 압축 예제 (libjpeg 활용)

#include <stdio.h>
#include <jpeglib.h>

void compress_jpeg(const char *input, const char *output) {
    FILE *infile = fopen(input, "rb");
    FILE *outfile = fopen(output, "wb");
    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr jerr;
    JSAMPARRAY buffer;
    int row_stride;

    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
    jpeg_stdio_dest(&cinfo, outfile);

    // JPEG 설정 및 압축 실행 과정 생략

    jpeg_destroy_compress(&cinfo);
    fclose(infile);
    fclose(outfile);
}

3. 무손실 압축과 손실 압축의 선택 기준

비교 항목 무손실 압축 손실 압축
원본 유지 유지됨 일부 손실
압축률 낮음 높음
복원 가능성 완전 복원 가능 완전 복원 불가능
사용 사례 텍스트, 실행 파일, 금융 데이터 이미지, 오디오, 비디오

무손실 압축과 손실 압축은 데이터의 성격과 사용 목적에 따라 선택해야 합니다. 원본의 정확성이 중요한 경우에는 무손실 압축이, 파일 크기 절감이 더 중요한 경우에는 손실 압축이 적합합니다.

4. 결론

무손실 압축과 손실 압축은 데이터 압축 기술의 핵심 개념으로, 각각의 특성과 용도를 이해하는 것이 중요합니다. 압축 알고리즘을 적절히 활용하면 저장 공간을 효율적으로 사용하고, 네트워크 전송 속도를 향상시킬 수 있습니다.

반응형