사전 비트맵
용어함정

비트맵

gabury1고친 사람 github-actions[bot]

비트맵은 칸을 줄지어 두고 칸마다 값을 하나씩 적어 기억합니다. 이 이름은 두 분야에서 서로 다른 물건을 부릅니다. 그래픽스에서는 색을 칠한 점을 격자로 모은 그림입니다. 시스템과 데이터베이스에서는 항목마다 해당하는지 아닌지(쓰는 중인가, 조건에 맞는가)를 0 과 1 로 적은 표입니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 칸마다 값을 하나씩 적어 두는 표입니다. 사진 한 장도, 디스크에서 빈 곳을 적어 둔 표도 이 이름으로 부릅니다.

왜 이렇게 하나 — 칸 번호만 알면 값을 바로 찾습니다. 예와 아니오만 적는 표는 칸 하나가 비트 하나라서 아주 작습니다.

어떻게 도나

  1. 그림이면 칸마다 그 점의 색을 적습니다
  2. 표면 칸마다 0 이나 1 을 적습니다. 1 은 「쓰는 중」이나 「해당함」입니다
  3. 표 두 개를 칸끼리 겹쳐 둘 다 1 인 칸을 한 번에 골라냅니다

대가 — 칸 수만큼 메모리를 늘 씁니다. 1 이 몇 개 없어도 표 전체를 들고 있어야 합니다. 그림은 크게 늘리면 칸이 드러나 가장자리가 계단처럼 보입니다.

상세

앞의 소절들은 항목마다 0 과 1 을 적는 표를 다룹니다. 뒤의 소절들은 점을 격자로 모은 그림을 다룹니다.

비트맵이 가리키는 두 물건

두 뜻은 뿌리가 같습니다. 이름은 비트(bit)와 지도(map)를 붙인 말입니다. 비트는 0 이나 1 하나만 담는 가장 작은 정보 단위입니다. 칸 하나에 비트 하나를 맞춰 무언가의 지도를 그린다는 뜻입니다.

맥락 비트맵이 가리키는 것 칸 하나에 든 것 예
시스템 · 데이터베이스 항목마다 비트 하나를 맞춘 표 0 이나 1 디스크 칸(블록)의 쓰임 표 · 행마다 열이 널인지 적은 표
그래픽스 점을 격자로 모은 그림 그 점의 색 사진 · 화면 캡처 · 캔버스에 그린 그림

두 뜻을 가르는 것은 셋째 열입니다. 시스템 쪽 칸에는 언제나 비트 하나가 듭니다. 그래픽스 쪽 칸에는 색 하나가 듭니다. 색을 적으려면 비트가 여러 개 필요합니다.

항목마다 비트 하나를 두는 표

출석부를 떠올리면 됩니다. 학생마다 번호가 있습니다. 번호 옆에는 칸이 하나씩 있습니다. 온 학생의 칸에만 표시를 합니다. 누가 왔는지 보려면 그 번호의 칸만 보면 됩니다.

시스템 쪽 비트맵도 같은 모양입니다. 항목에 0 번부터 번호를 매기고 번호마다 비트 하나를 둡니다. 1 이면 「해당함」이고 0 이면 「해당하지 않음」입니다. 이 모양을 비트 배열이라고도 합니다.

칸마다 비트 하나를 쓰는 것은 공간을 아끼려는 것입니다. 바이트는 비트 여덟 개 묶음입니다. 예와 아니오를 칸마다 바이트 하나에 적으면 같은 표가 여덟 배로 커집니다. 항목이 1억 개면 비트맵은 1억 비트, 곧 약 12.5메가바이트입니다.

파일 시스템이 대표적인 예입니다. 파일 시스템은 디스크를 같은 크기의 블록으로 나눠 씁니다. 블록마다 비트 하나를 둡니다. 쓰는 중이면 1 을, 비어 있으면 0 을 적습니다. 새 파일을 쓸 때는 0 인 칸을 찾아 그 블록을 내줍니다. 내준 블록의 칸은 1 로 바꿉니다.

비트를 켜고 읽는 법

칸 하나를 켜고 끄고 읽는 일은 비트 연산 몇 개로 끝납니다. 비트 연산은 정수를 비트 단위로 밀거나 겹치는 연산입니다.

아래 자바 코드는 64비트 정수 하나를 블록 64개의 쓰임 표로 씁니다. 줄 오른쪽 주석은 그 줄이 만든 값입니다. 주석의 0b 는 값을 2진수로 적었다는 표시입니다.

Java
long used = 0;
used |= 1L << 2;            // 0b100
used |= 1L << 5;            // 0b100100
long b5 = (used >> 5) & 1;  // 1
long b3 = (used >> 3) & 1;  // 0
used &= ~(1L << 5);         // 0b100

둘째 줄의 1L << 2 는 1 을 왼쪽으로 두 칸 밀어 2번 비트만 켠 값입니다. |= 가 그 비트를 표에 켭니다. 2번과 5번 블록이 쓰는 중으로 표시됩니다.

읽을 때는 거꾸로 오른쪽으로 밀어 그 칸을 맨 끝으로 옮깁니다. &(AND) 는 두 값에서 둘 다 1 인 비트만 남깁니다. 그래서 1 과 & 하면 맨 끝 비트만 남습니다. 5번 칸은 1 이, 3번 칸은 0 이 나옵니다.

마지막 줄은 5번 칸을 꺼서 그 블록을 비웠다고 표시합니다. ~ 는 모든 비트를 뒤집는 연산이라 ~(1L << 5) 는 5번 비트만 0 인 값이 됩니다. 이 값과 &= 하면 5번 칸만 0 이 됩니다. 나머지 칸은 그대로 남습니다.

두 비트맵을 칸끼리 겹치기

비트맵의 쓸모는 표 두 개를 칸끼리 겹칠 때 커집니다. 두 비트맵을 AND 하면 양쪽 다 1 인 칸만 1 로 남습니다. OR 하면 어느 한쪽이라도 1 인 칸이 1 로 남습니다.

이 연산은 칸을 하나씩 돌지 않습니다. 64비트 CPU(Central Processing Unit, 중앙 처리 장치)는 64비트 정수 두 개를 명령 하나로 AND 합니다. 칸 64개를 한 번에 겹치는 셈입니다.

데이터베이스의 비트맵 인덱스가 이 연산을 씁니다. 비트맵 인덱스는 열의 값마다 비트맵을 하나 둡니다. 그 비트맵의 칸 하나가 테이블의 행 하나에 맞습니다. 조건 두 개를 함께 거는 질의는 두 비트맵을 AND 한 결과로 답합니다.

아래 표에서 행 다섯 개짜리 테이블의 「등급이 골드이면서 지역이 서울인 행」을 찾아 봅니다.

비트맵 행 0 행 1 행 2 행 3 행 4
등급 = 골드 1 0 1 1 0
지역 = 서울 1 1 0 1 0
둘을 AND 한 결과 1 0 0 1 0

마지막 줄에서 1 인 칸이 답입니다. 0 번 행과 3 번 행이 두 조건을 다 채웁니다.

비트맵으로 쓰임을 적는 시스템 부품

같은 표가 시스템 곳곳에 들어 있습니다. 칸 하나가 무엇에 맞고 무엇을 묻는지만 다릅니다.

쓰는 곳 칸 하나가 맞는 것 칸이 답하는 물음
파일 시스템 디스크 블록 하나 이 블록을 쓰는 중인가
운영체제의 메모리 관리 메모리를 같은 크기로 나눈 조각(페이지) 하나 이 조각이 이미 내줘졌나
데이터베이스의 행 열 하나 이 열이 널인가
비트맵 인덱스 테이블의 행 하나 이 행이 그 값을 가졌나

네 줄 모두 칸마다 같은 꼴의 물음을 던집니다. 「이 번호의 항목이 그런가」에 예나 아니오로 답합니다.

셋째 줄처럼 행마다 열이 널인지 적은 표를 널 비트맵이라 합니다. 널은 그 열에 값이 비어 있다는 표시입니다.

1 이 드문 표의 낭비

비트맵은 항목 수만큼 칸을 늘 들고 있습니다. 1 이 몇 개뿐이어도 0 인 칸까지 전부 메모리를 차지합니다.

항목 1억 개 가운데 1 이 열 개뿐인 표를 생각해 봅니다. 비트맵으로는 여전히 약 12.5메가바이트입니다. 1 인 번호 열 개만 8바이트 정수로 적으면 80바이트로 끝납니다.

1 이 드문 표를 번호 목록으로 적는 이유가 이것입니다. 거꾸로 1 이 많을수록 비트맵이 유리해집니다. 번호 목록은 1 하나마다 정수 하나를 씁니다. 비트맵은 칸마다 비트 하나로 끝납니다.

둘 사이의 절충이 압축 비트맵입니다. 비트맵을 일정한 크기의 덩어리로 자릅니다. 그중 모두 0 인 덩어리는 적지 않고 건너뜁니다.

점을 격자로 모은 그림

그래픽스에서 비트맵은 그림을 담는 방식입니다. 그림을 가로세로 격자로 자릅니다. 칸마다 색을 하나씩 적습니다. 이 칸 하나가 픽셀입니다. 가로 1920 칸, 세로 1080 칸짜리 화면 캡처는 픽셀 약 207만 개로 된 비트맵입니다.

이름이 가장 잘 맞는 것은 흑백 그림입니다. 점이 켜졌는지 꺼졌는지만 적으면 픽셀 하나가 비트 하나입니다. 아래는 가로세로 다섯 칸짜리 흑백 비트맵입니다. 1 인 칸만 검게 칠하면 글자 T 가 나옵니다.

block-beta
columns 5
  a1["1"] a2["1"] a3["1"] a4["1"] a5["1"]
  b1["0"] b2["0"] b3["1"] b4["0"] b5["0"]
  c1["0"] c2["0"] c3["1"] c4["0"] c5["0"]
  d1["0"] d2["0"] d3["1"] d4["0"] d5["0"]
  e1["0"] e2["0"] e3["1"] e4["0"] e5["0"]

색을 담으려면 칸 하나에 비트가 여러 개 필요합니다. 픽셀 하나에 쓰는 비트 수가 색 깊이입니다. 흔한 것은 빨강·초록·파랑을 8비트씩 적는 24비트입니다. 불투명도 8비트를 더해 32비트, 곧 4바이트로 적기도 합니다.

칸 하나가 32비트여도 그래픽스에서는 이 그림을 계속 비트맵이라고 부릅니다. 이 맥락의 비트맵은 「칸마다 비트 하나」가 아니라 「픽셀 격자로 담은 그림」을 뜻합니다. 같은 것을 래스터 이미지라고도 합니다.

압축 파일과 풀린 비트맵

디스크에 있는 이미지 파일은 대개 비트맵을 압축해 둔 것입니다. 그림을 화면에 그리거나 크기를 바꾸려면 먼저 디코딩을 해야 합니다. 디코딩은 압축을 풀어 비트맵으로 되돌리는 일입니다.

풀린 비트맵의 크기는 파일 크기와 상관없이 칸 수로 정해집니다. 가로 칸 수와 세로 칸 수와 픽셀 하나의 바이트 수를 곱합니다.

Java
long bytes = 1920L * 1080 * 4;  // 8294400

가로 1920, 세로 1080 그림을 픽셀당 4바이트로 풀면 약 8.3메가바이트입니다. 파일이 그보다 훨씬 작아도 풀린 크기는 같습니다.

백엔드에서는 썸네일을 만드는 서버가 이 계산을 만납니다. 가로 4000, 세로 3000 사진을 픽셀당 4바이트로 풀면 한 장에 48메가바이트입니다. 이런 사진 열 장을 동시에 풀면 서버는 파일 크기와 상관없이 약 480메가바이트를 씁니다.

비트맵과 벡터 그래픽스

비트맵 그림의 반대편에 벡터 그래픽스가 있습니다. 벡터 그림은 픽셀 대신 도형을 기억합니다. 「중심이 여기이고 반지름이 이만큼인 원」처럼 좌표와 모양으로 적습니다.

비트맵은 칸의 색만 기억합니다. 어느 칸들이 모여 원을 이뤘는지는 남지 않습니다. 원을 옮기려면 지우고 다른 곳에 다시 칠해야 합니다. 웹 페이지의 canvas 요소가 그림을 이렇게 담습니다.

비트맵 벡터 그림
기억하는 것 칸마다 색 도형과 좌표
크게 늘리면 칸이 커져 가장자리가 계단처럼 보인다 다시 계산해 매끈하다
잘 맞는 그림 사진처럼 점마다 색이 다른 그림 아이콘 · 로고처럼 도형으로 나뉘는 그림
담는 데 드는 용량을 정하는 것 칸 수 도형 수

사진은 도형으로 나눌 수 없어서 비트맵으로 담습니다. 벡터 그림도 화면에 보일 때는 결국 비트맵이 됩니다. 도형을 픽셀 칸으로 바꾸는 이 일이 래스터화입니다.

모니터에 나가는 화면도 비트맵입니다. 화면에 보낼 픽셀들을 담아 두는 메모리가 프레임버퍼입니다.

flowchart TD
    V["벡터 그림 · 도형과 좌표"] -->|래스터화| B["비트맵 · 픽셀 격자"]
    F["압축된 이미지 파일"] -->|디코딩| B
    B --> FB["프레임버퍼"]
    FB --> S["화면"]

그림에서 두 갈래가 비트맵으로 모입니다. 도형은 래스터화를 거쳐 픽셀 격자가 됩니다. 압축 파일은 디코딩을 거쳐 픽셀 격자가 됩니다. 그 격자가 프레임버퍼를 지나 화면에 나갑니다.

어느 뜻인지 가르는 단서

대화나 문서에서 「비트맵」이 나오면 함께 붙은 낱말을 봅니다. 대개 그것만으로 어느 뜻인지 갈립니다.

함께 나오는 말 뜻
픽셀 · 해상도 · 색 · 이미지 파일 · 캔버스 · 확대 픽셀 격자로 담은 그림
블록 · 페이지 · 할당 · 인덱스 · 널 · AND · 비트 연산 항목마다 비트 하나를 둔 표

이름에 비트맵이 붙어도 그림과 상관없는 것이 많습니다. 비트맵 인덱스와 널 비트맵은 표 쪽입니다. 그림 쪽에는 글자 모양을 픽셀 격자로 담은 비트맵 글꼴이 있습니다.

두 뜻은 칸 하나에 든 것만 다릅니다. 둘 다 번호로 칸을 바로 찾습니다. 메모리도 둘 다 칸 수만큼 씁니다.

관련 항목

비트맵 칸을 이루는 단위

비트 · 바이트 · 픽셀 · 색 깊이 · 비트 연산 · 비트 마스크

항목마다 비트 하나를 두는 표를 쓰는 구조

비트 배열 · 비트맵 인덱스 · 블룸 필터 · 압축 비트맵 · 비트맵 스캔 · 널 · 해시 함수

비트맵으로 빈 공간을 추적하는 시스템 부품

파일 시스템 · 블록 · 페이지 · 메모리 관리 · 빈 공간 관리 · 데이터베이스

픽셀 격자 비트맵을 만들고 화면에 보내는 과정

래스터화 · 디코딩 · 프레임버퍼 · 캔버스 · canvas 요소 · 즉시 모드 · 그래픽스

비트맵 그림과 맞세워지는 대립 개념

벡터 그래픽스 · SVG · 벡터 글꼴 · 유지 모드

비트맵 그림을 담는 파일 포맷

래스터 그래픽스 · PNG · JPEG · BMP · 이미지 압축

비트맵 그림의 품질을 정하는 요소

해상도 · 색 공간 · 안티에일리어싱 · 계단 현상

다른 이름: bitmap