스크롤하여 페이지 넘기기
Computer Science Principles · AP Computer Science Principles
비트, 압축, 정보
컴퓨터가 가진 모든 것, 곧 수, 이름, 사진, 노래는 근본적으로 비트의 패턴입니다.
비트(binary digit의 줄임말)는 0 또는 1입니다. 컴퓨팅 장치는 데이터를 디지털로 표현합니다. 어떤 값이든 가장 낮은 수준의 구성 요소는 비트입니다.
그림은 이진수로 셉니다. 각 타일은 비트 하나이며, 종이 면은 0, 빨간 면은 1이고, 그 아래에 자릿값 128, 64, 32, 16, 8, 4, 2, 1이 있습니다. 한 단계마다 1이 더해집니다. 가장 오른쪽 비트가 뒤집히고, 1이 0으로 뒤집히는 곳마다 올림이 한 자리 왼쪽으로 퍼집니다. 00000111(7)이 00001000(8)이 될 때처럼 말입니다.
프로그램은 데이터 값을 변수에, 항목들의 리스트에, 또는 독립된 상수로 보관하고, 프로시저에 입력으로 넘기고 출력으로 돌려받습니다. 형태가 무엇이든 값은 비트로 저장되며, 프로그램이 이를 사람이 읽을 수 있는 형태로 바꿔 줍니다.
이 장은 AP Computer Science Principles의 빅 아이디어 2, 데이터로, 객관식 시험의 17–22%를 차지합니다. 이진수(2.1), 데이터 압축(2.2), 데이터에서 정보 추출하기(2.3), 데이터와 프로그램 사용하기(2.4)를 다룹니다.
비트를 묶어 만든 추상화
바이트는 8비트입니다. 바이트 하나만으로는 아무 의미도 없습니다. 그 의미는 그것을 읽는 프로그램이 무엇으로 받아들이느냐에 달려 있습니다.
추상화는 핵심 아이디어에 집중해 복잡성을 줄이는 과정입니다. 당면한 질문과 관계없는 세부 사항은 감추고 관련 있고 유용한 세부 사항은 한데 모아, 추상화는 비트가 아니라 아이디어 자체를 생각하게 해 줍니다.
비트는 수, 문자, 색 등(이에 한정되지 않음)의 추상화를 나타내도록 묶입니다. 그림은 한 바이트 01000001을 세 가지로 읽습니다.
| 읽는 방식 | 의미 |
|---|---|
| 이진수 | 65 |
| 문자(ASCII와 유니코드 코드 65) | 글자 A |
| 픽셀의 밝기, 0(검정)에서 255(흰색) | 어두운 회색 |
이처럼 같은 비트열이 맥락에 따라 서로 다른 종류의 데이터를 나타낼 수 있습니다. 컬러 이미지는 보통 픽셀마다 이런 수를 세 개 저장하는데, 빨강, 초록, 파랑에 하나씩이며 3바이트, 곧 24비트입니다.
자릿값, 오른쪽 끝을 0으로 번호 매김
이진수와 십진수를 비롯한 진법은 데이터를 나타내는 데 쓰입니다. 십진수(10진법)는 숫자 0–9만 쓰고, 이진수(2진법)는 0과 1만 씁니다.
십진수에서처럼 숫자의 위치가 그 값을 정합니다. 수의 값은 숫자에 그 위치의 자릿값을 곱한 것입니다. 자릿값은 진법의 밑을 위치만큼 거듭제곱한 값이며, 위치는 가장 오른쪽을 0으로 하여 왼쪽으로 갈수록 1씩 늘어납니다. 십진수에서 305 = 3 × 102 + 0 × 101 + 5 × 100입니다.
이진수에서는 각 자리의 값이 오른쪽 자리의 두 배입니다. 10110101의 경우는 다음과 같습니다.
| 위치 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 자릿값 | 27 = 128 | 26 = 64 | 25 = 32 | 24 = 16 | 23 = 8 | 22 = 4 | 21 = 2 | 20 = 1 |
| 비트 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
비트가 1인 자리의 자릿값을 더합니다. 128 + 32 + 16 + 4 + 1 = 181입니다. 0인 비트는 아무것도 더하지 않습니다. 그림은 왼쪽에서 오른쪽으로 읽으며, 1마다 자릿값이 합계로 떨어집니다.
들어가는 가장 큰 자릿값부터 사용
양의 정수를 이진수로 쓰려면 가장 큰 자릿값부터 내려가며 구합니다. 자릿값이 남은 값에 들어가면 1을 쓰고 그만큼 빼며, 들어가지 않으면 0을 씁니다.
100을 8비트로 나타내면 다음과 같습니다.
| 자릿값 | 남은 값 | 들어가는가? | 비트 | 뺀 뒤 |
|---|---|---|---|---|
| 128 | 100 | no | 0 | 100 |
| 64 | 100 | yes | 1 | 36 |
| 32 | 36 | yes | 1 | 4 |
| 16 | 4 | no | 0 | 4 |
| 8 | 4 | no | 0 | 4 |
| 4 | 4 | yes | 1 | 0 |
| 2 | 0 | no | 0 | 0 |
| 1 | 0 | no | 0 | 0 |
따라서 100 = 01100100입니다. 64 + 32 + 4 = 100입니다. 앞쪽의 0은 아무것도 바꾸지 않으므로 01100100과 1100100은 같은 수입니다.
두 번째 방법은 2로 계속 나누고 나머지를 마지막 것부터 첫 번째 것까지 읽는 것입니다. 100 ÷ 2 = 50 나머지 0; 50 ÷ 2 = 25 나머지 0; 25 ÷ 2 = 12 나머지 1; 12 ÷ 2 = 6 나머지 0; 6 ÷ 2 = 3 나머지 0; 3 ÷ 2 = 1 나머지 1; 1 ÷ 2 = 0 나머지 1. 위로 읽으면 1100100입니다.
그림에서 파란 막대는 100 중에서 남은 값입니다. 1마다 막대에서 그 자릿값이 떨어져 나가고 타일이 빨간색이 됩니다.
이진수 비교하기
비트 1개로는 패턴이 2가지입니다. 비트가 하나 늘 때마다 개수가 두 배가 됩니다. 기존 패턴마다 앞에 0을 붙인 것과 1을 붙인 것이 생기기 때문입니다. 그래서 n비트로는 2n가지 패턴을 만들 수 있습니다.
그림이 패턴을 만들어 갑니다. 1 비트, 2; 2 bits, 4; 3 bits, 8; 4 bits, 16. 1바이트에는 28 = 256가지 패턴이 있고, 0부터 255까지의 정수를 나타냅니다. n비트로 나타낼 수 있는 가장 큰 수는 모두 1인 수, 2n − 1입니다.
글자 26개에 각각 고유한 패턴을 주려면 비트가 몇 개 필요할까요? 24 = 16은 모자라고, 25 = 32은 충분합니다. 답은 5비트입니다.
비교하고 순서 매기기. 두 수의 비트 수를 같게 맞추고(앞에 0을 채움) 왼쪽부터 훑습니다. 처음으로 다른 위치가 결과를 정합니다. 그 위치에 1이 있는 수가 더 큽니다. 그 자릿값 하나가 오른쪽 모든 자리의 합보다 크기 때문입니다(2p > 2p − 1).
01101100과 01011111은 위치 5, 곧 32의 자리에서 처음으로 달라지며 첫 번째 수에 1이 있습니다. 그 뒤의 비트가 무엇이든 108 > 95입니다.
오버플로와 반올림 오차
많은 프로그래밍 언어에서 정수는 고정된 수의 비트로 표현됩니다. 이 때문에 정수 값의 범위와 그 값으로 하는 수학 계산이 제한되고, 오버플로 같은 오류가 생길 수 있습니다.
그림의 카운터(가상)는 4비트이므로 0부터 15까지를 담습니다. 15(1111)에 1을 더하려면 다섯 번째 비트가 필요합니다. 올림이 갈 곳이 없으므로 카운터는 0을 보여 줍니다. 이것이 오버플로입니다.
다른 언어들은 정수의 크기가 컴퓨터 메모리의 크기로만 제한되는 추상화를 제공합니다. 시험 참고 자료에 쓰인 언어가 그중 하나입니다. 그 언어의 정수는 오버플로가 일어나지 않습니다.
실수(소수 부분이 있는 수)도 고정된 수의 비트로 저장되므로 범위와 그 값으로 하는 계산이 제한되고, 반올림 오차 같은 오류가 생길 수 있습니다. 어떤 실수는 근삿값으로만 저장됩니다. 소수 부분 비트가 3개이면(그림, 가상) 1/8 = 0.125의 배수만 존재합니다. 0.1은 0.125(으)로 저장되어 0.025만큼 차이가 납니다.
실제 언어는 훨씬 많은 비트를 쓰므로 오차가 훨씬 작지만 없어지지는 않습니다. 많은 언어에서 0.1 + 0.2는 0.30000000000000004(으)로 계산됩니다. 실수의 구체적인 범위 한계는 이 과정과 시험의 범위를 벗어납니다.
디지털 근삿값
아날로그 데이터는 시간에 따라 띄엄띄엄이 아니라 매끄럽게 변하는 값을 가집니다. 음악의 음높이와 크기, 그림의 색, 달리기 선수의 경기 중 위치가 그 예입니다.
컴퓨터는 비트를 저장하므로 아날로그 데이터를 근삿값으로만 나타낼 수 있습니다. 디지털 데이터로 현실 세계의 아날로그 데이터를 근사하는 것은 추상화의 한 예입니다.
아날로그 데이터는 표본화로 디지털에서 아주 가깝게 근사할 수 있습니다. 표본화는 아날로그 신호의 값을 일정한 간격으로 측정하는 것이며, 측정한 값을 표본이라고 합니다. 각 표본은 저장에 필요한 정확한 비트를 알아내려고 측정합니다.
그림은 같은 매끄러운 신호를 두 번 표본화합니다. 먼저 표본 8개를 각각 4단계(2비트) 중 하나로 반올림합니다. 8 × 2 = 16비트이며, 거친 계단 모양이 됩니다. 다음으로 표본 16개를 8단계(3비트)로 합니다. 16 × 3 = 48비트이며, 계단이 곡선에 더 가깝게 붙습니다(신호와의 평균 거리가 43% 줄어듭니다).
표본이 많고 표본당 비트가 많을수록 근사가 더 가까워지지만, 저장하거나 보내는 데 더 많은 비트가 듭니다. 아무리 유한한 개수의 표본으로도 정확해질 수는 없습니다.
더 작아지고, 정확히 되돌아옴
데이터 압축은 전송하거나 저장하는 데이터의 크기(비트 수)를 줄일 수 있습니다. 무손실 알고리즘은 대개 크기를 줄이면서도 원래 데이터를 완전히 복원할 수 있음을 보장합니다.
그림의 행은 픽셀이 20개이고 픽셀당 1바이트이므로 20바이트입니다(가상). 런 렝스 부호화는 한 색이 이어지는 구간을 개수와 색으로 저장합니다. 7W 4R 6W 3B이며, 4개 구간 × 2바이트 = 8바이트입니다.
복호화하면 7 white, 4 red, 6 white, 3 blue이(가) 되어 원래 행과 픽셀 하나하나까지 똑같습니다. 잃은 것이 없으므로 비트가 적다고 해서 정보가 적은 것은 아닙니다.
크기가 줄어드는 정도는 원래 데이터에 있는 중복성의 양과 적용한 압축 알고리즘 두 가지에 모두 달려 있습니다. 같은 색이 길게 이어지면 잘 압축됩니다. 픽셀마다 색이 번갈아 나오는 행(WRWRWR…)은 길이 1인 구간이 20개이므로, 부호화하면 40바이트가 되어 처음의 20바이트보다 커집니다.
훨씬 작아지지만 근삿값일 뿐
손실 알고리즘은 저장하거나 보내는 비트 수를 크게 줄일 수 있지만, 원래 데이터의 근삿값만 복원할 수 있습니다.
그림의 픽셀 16개(가상의 밝기, 픽셀당 1바이트)는 두 개씩 짝지어 평균만 남깁니다. 8바이트로 크기가 절반입니다. 복호화하면 각 픽셀은 짝의 평균값을 받습니다. 16개 중 14개가 최대 10만큼 다르게 돌아옵니다. 회색 유령이 원래 값이며, 8바이트 안에는 그것을 되돌릴 방법이 없습니다. 200, 180의 짝과 190, 190의 짝은 둘 다 평균이 190입니다.
손실 알고리즘은 대개 무손실 알고리즘보다 비트를 더 많이 줄일 수 있습니다. 어느 쪽을 고를지는 상황에 달려 있습니다.
| 가장 중요한 것 | 보통 선택하는 방식 |
|---|---|
| 품질, 또는 원본을 정확히 복원하는 능력(프로그램 파일, 텍스트 문서) | 무손실 |
| 데이터 크기나 전송 시간을 최소화하는 것(느린 연결에서의 동영상 스트리밍) | 손실 |
패턴과, 그것이 증명하지 못하는 것
정보는 데이터에서 뽑아낸 사실과 패턴의 모음입니다. 데이터는 추세를 찾고, 연결 고리를 만들고, 문제를 해결할 기회를 줍니다.
그림은 해변 마을의 가상의 24일을 그립니다. 아이스크림 판매량 대 햇볕에 심하게 탄 사례의 수입니다. 하나가 늘면 다른 하나도 늘어나는 강한 상관관계입니다(상관계수 r = 0.86, 1이면 완벽한 직선).
아이스크림이 햇볕 화상을 일으키는 것은 아닙니다. 날들을 기온에 따라 색칠하면 이유가 드러납니다. 더운 날 7일(빨간색, 27 °C 이상)에는 아이스크림도 더 많이 팔리고 햇볕도 더 강합니다. 데이터에서 발견한 상관관계가 반드시 인과관계가 있음을 뜻하지는 않으며, 관계의 정확한 성질을 이해하려면 추가 연구가 필요합니다.
여기서는 판매 기록만으로는 그것을 보일 수 없었습니다. 하나의 출처에 결론을 내리는 데 필요한 데이터가 없는 경우가 많으며, 여러 출처의 데이터(판매, 진료소 방문, 날씨 기록)를 결합해야 합니다.
데이터에 관한 데이터
메타데이터는 데이터에 관한 데이터입니다. 사진이 데이터이고, 그 메타데이터에는 만든 날짜, 파일 크기, 크기(가로세로), 태그가 있을 수 있습니다.
메타데이터를 바꾸거나 지워도 원래 데이터는 바뀌지 않습니다. 그림에서 태그 “노을”을 지워도 64개의 픽셀 중 어느 것도 바뀌지 않습니다.
메타데이터는 정보를 찾고, 정리하고, 관리하는 데 쓰입니다. 사진 라이브러리는 픽셀을 하나도 보지 않고 6월 14일에 찍은 사진을 모두, 또는 “해변” 태그가 붙은 사진을 모두 나열할 수 있습니다. 메타데이터는 추가 정보를 제공해 데이터를 더 효과적으로 쓰게 하고, 데이터를 구조화하고 정리할 수 있게 합니다.
시험에서는 상황이 수집된 데이터와 메타데이터를 주고 무엇을 알아낼 수 있는지 묻습니다. 각 필드가 무엇을 기록하는지 따져 보세요. 날짜와 태그만 있는 라이브러리는 “6월에 찍은 사진이 몇 장인가?”에는 답할 수 있지만 “이 사진은 어디서 찍었나?”에는 답할 수 없습니다. 장소를 기록한 필드가 없기 때문입니다.
의미는 바꾸지 않고 형식을 통일
데이터 집합은 크기와 관계없이 몇 가지 어려움이 있습니다. 데이터를 정제해야 하고, 불완전한 데이터와 유효하지 않은 데이터가 있으며, 여러 데이터 출처를 결합해야 합니다. 데이터를 처리하는 능력은 사용자와 도구의 역량에 달려 있습니다.
데이터를 어떻게 수집했느냐에 따라 형식이 통일되어 있지 않을 수 있습니다. 사용자가 자유 입력란에 입력하면 줄여 쓰는 방식, 철자, 대소문자가 사용자마다 다릅니다. 그림의 가입 양식(가상)에는 도시 2곳에 대한 서로 다른 표기가 7가지 있습니다.
정제는 같은 뜻의 약어, 철자, 대소문자를 모두 같은 단어로 바꿔서 의미는 바꾸지 않고 데이터를 통일합니다. 5개의 항목이 다시 쓰이고, 7가지 표기가 2(으)로 바뀝니다. 이제 도시별 가입자 수를 세는 프로그램이 올바르게 셉니다.
정제로 빠진 것을 만들어 낼 수는 없습니다. 한 행에는 나이가 없고(불완전), 한 행은 −4(이)라고 되어 있습니다(유효하지 않음). 이런 행에는 표시를 하여 확인하거나 분석에서 제외하며, 짐작으로 채우지 않습니다.
데이터가 많다고 좋은 데이터는 아님
편향 문제는 흔히 수집하는 데이터의 종류나 출처 때문에 생깁니다. 단순히 데이터를 더 많이 모은다고 편향이 없어지지는 않습니다.
그림의 여론 조사(가상)는 모집단의 왼쪽 일부에만 닿습니다. 예를 들어 한 웹사이트의 독자입니다. 전체 모집단에서는 41%이(가) 빨간색 의견을 가집니다. 응답 30개 뒤에 조사는 80%(이)라고 하고, 60개 뒤에는 78%(이)라고 합니다. 응답이 두 배가 되어도 틀린 그림은 같습니다. 모든 응답이 대표성이 없는 같은 출처에서 오기 때문입니다.
그래도 크기는 중요합니다. 데이터 집합의 크기는 거기서 뽑아낼 수 있는 정보의 양에 영향을 줍니다. 하지만 큰 데이터 집합은 컴퓨터 한 대로 처리하기 어려워 병렬 시스템, 곧 여러 프로세서가 데이터의 일부를 동시에 처리하는 시스템이 필요할 수 있습니다.
시스템의 확장성은 데이터 집합을 다룰 때 중요한 고려 사항입니다. 시스템의 계산 능력이 데이터 집합을 어떻게 처리하고 저장할 수 있는지에 영향을 주기 때문입니다.
리스트를 처리하는 프로그램
프로그램으로 데이터를 처리해 정보를 얻을 수 있습니다. 검색 도구는 정보를 효율적으로 찾는 데 유용하고, 데이터 필터링 시스템은 정보를 찾고 데이터의 패턴을 알아보는 데 중요한 도구입니다.
필터링은 조건을 만족하는 요소만 남깁니다. 리스트에서 양수만 남기거나, 밴드에 가입한 학생만 남기는 것이 그 예입니다.
data ← [4, -2, 7, 0, -5, 3] positives ← [] FOR EACH n IN data { IF(n > 0) { APPEND(positives, n) } } 그림은 이것을 실행하며 지금 실행 중인 줄을 빨간색으로 보여 줍니다. 각 n을 검사하고, n > 0인 것만 추가합니다. positives는 마지막에 [4, 7, 3]이(가) 됩니다. 0은 남지 않습니다. 0 > 0이 거짓이기 때문입니다.
변환은 모든 요소를 바꿉니다. 리스트의 모든 요소를 두 배로 하거나, 모든 학생 기록에 학부모 이메일을 추가하는 것이 그 예입니다. 먼저 doubled ← []로 시작하면 다음과 같습니다.
FOR EACH n IN data { APPEND(doubled, 2 * n) } doubled는 마지막에 [8, −4, 14, 0, −10, 6]이(가) 됩니다. 통찰은 데이터를 옮기고 변환하는 데서 나올 수 있으며, 프로그램으로 데이터를 변환하면 패턴이 드러날 수 있습니다. 프로그래머는 프로그램으로 데이터를 필터링하고 정제하기도 합니다.
여러 수에서 하나의 수, 그리고 차트
결합 또는 비교는 많은 값을 하나의 답으로 줄입니다. 수의 리스트를 모두 더하거나, 평점이 가장 높은 학생을 찾는 것이 그 예입니다. 시각화는 데이터 집합을 차트, 그래프 같은 시각적 표현으로 보여 줍니다.
한 동아리가 6주 동안의 가입자 수를 기록합니다(가상). signups ← [12, 18, 9, 22, 15, 20].
total ← 0 most ← signups[1] FOR EACH n IN signups { total ← total + n IF(n > most) { most ← n } } DISPLAY(total) DISPLAY(most) 출력은 96 22입니다. 6주 동안 가입자는 모두 96명이고, 가장 많았던 주에는 22명입니다. most는 0이 아니라 첫 번째 값인 signups[1]에서 시작하므로, 모든 값이 음수여도 올바르게 동작합니다. 실행되는 동안 그림은 각 주를 막대로 그립니다. 데이터를 읽는 대로 차트가 만들어집니다.
표, 도표, 글, 그 밖의 시각 도구로 데이터에서 얻은 통찰과 지식을 전달할 수 있습니다. 스프레드시트 같은 프로그램은 정보를 효율적으로 정리하고 추세를 찾는 데 도움이 됩니다.
프로그램은 반복적이고 대화형으로 쓰입니다. 차트를 보고, 새로운 질문을 하고, 다시 필터링하거나 변환합니다. 데이터 출처를 결합하고, 데이터를 군집화(비슷한 항목을 묶기)하고, 분류(항목을 범주로 나누기)하는 것은 프로그램으로 데이터에서 통찰과 지식을 얻는 과정의 일부입니다.