요약
이 수업은 데이터와 그 자료형을 다루는, 강좌의 두 번째 단원을 연다. 수업은 단원의 목적을 설명한다. 곧, 프로그램의 모든 데이터는 자료형과 함께 메모리에 놓이며 그 자료형이 데이터가 가질 수 있는 값, 차지하는 크기, 허용하는 연산을 정한다는 것, 그리고 그 한계에는 관찰할 수 있는 결과가 따른다는 것을 가르치는 것이다. 또 단원의 네 수업과, 이름과 값을 가진 칸으로서의 변수에서 자료형 사이의 변환과 상수에 이르기까지 그 수업들을 잇는 실을 소개하고, 단원이 첫 단원에서 이미 안다고 전제하는 것, 곧 읽고 쓰는 프로그램을 작성하고 컴파일하고 실행하는 일을 상기시킨다. 단원이 해결하는 문제, 곧 겉보기에는 올바르지만 계산이 수학의 계산과 맞지 않는 프로그램의 문제를 합 에서 출발하여 제시하는데, 이 합은 컴퓨터에서 정확히 이 되지 않는다. 끝으로 이 단원이 뒤의 단원들과 C++ 프로그래밍 II 강좌에서 어디로 이어지는지 보여 준다.
학습 목표
- 단원 내용의 순서를 서술하고, 각 수업이 그 뒤의 수업에 무엇을 보태는지 설명한다.
- 1단원에서 필요한 것(컴파일과 실행의 순환, 형식을 갖춘 출력,
std::cin을 이용한 읽기, 컴파일러 메시지 읽기)을 떠올리고, 필요하면 복습한다. - 하나의 예로, 프로그램의 수가 왜 수학의 수가 아닌지 설명하고, 컴퓨터에서 가 왜 정확히 이 아닌지 미리 내다본다.
- 단원을 마칠 때 할 줄 알아야 하는 것을 확인하고, 그것을 뒤의 단원들에서 배울 것과 구별한다.
입문 평가
단원을 시작하기 전에 출발점을 재어 두면 좋다. 이 평가는 자기 평가이며 점수를 매기지 않는다. 목적은 오직 학습의 방향을 잡는 데 있다. 처음 네 문항은 단원이 첫 단원에서 이미 안다고 전제하는 것을 확인한다. 절차를 한 단계씩 따라가기, 수를 소수 둘째 자리까지 쓰기, 반올림, 그리고 오류 메시지 읽기이다. 그 뒤의 여섯 문항은 수업 순서대로 단원의 핵심 개념을 다룬다. 아직 맞힐 의무는 누구에게도 없으며, 그중 한 문항에서는 “아직 모르겠다”가 정직한 답이다. 맞든 틀리든 모든 답이 요점을 설명하고 그 요점을 다루는 수업을 알려 주기 때문이다. 같은 능력은 단원 끝의 종합 수업에서 다시 측정한다.
단원을 시작하기 전에 출발점을 확인해 보세요. 짧은 자기 평가입니다. 점수가 매겨지지 않으며 결과는 브라우저에만 저장됩니다.
문제 1이전 단원에서어떤 절차에 이렇게 적혀 있다. “1. 의 값을 17로 한다. 2. 의 값을 로 한다. 3. 의 값을 로 한다.” 끝났을 때 의 값은 얼마인가?
각 단계가 처음 값에서 출발한다고 생각한다. 두 번째 단계는 첫 번째 단계가 남긴 값에서 출발한다.“값을 …로 한다”를 수학의 등식으로 읽는다. 이것은 의 값을 바꾸는 명령이다.변수를 상수와 혼동한다. 변수의 값은 다른 값이 대입될 때마다 바뀐다.각 단계는 처음 값이 아니라 그 순간 의 값에서 출발한다. 단계마다 각 변수의 값을 적으며 절차를 손으로 따라가는 것이 1단원의 추적표이며, 2.1강은 그것을 프로그램의 상태를 추론하는 도구로 삼는다.복습: 문제에서 알고리즘으로
문제 2이전 단원에서문장
std::println("{:.2f}", 2.0 / 3);의 출력은 무엇인가?형식 지정이 버림을 한다고 생각한다. 실제로는 가장 가까운 값으로 반올림한다.형식 지정을 무시한다. 그것은.2f없이 쓸 때의 표기이다.나눗셈을 정수 나눗셈으로 생각한다. 소수 부분이 있는2.0때문에 나눗셈은 실수 나눗셈이 된다.형식 지정.2f에 따라 수는 반올림되어 소수 둘째 자리까지 출력된다. 의 출력은0.67이다. 저장된 값은 바뀌지 않으며, 바뀌는 것은 그 표기뿐이다.복습: 입력, 출력, 오류
문제 3이전 단원에서을 반올림하여 소수 둘째 자리까지 쓰려고 한다. 무엇을 얻는가?
반올림하지 않고 버린다. 셋째 자리 숫자를 보지도 않고 버린다.소수 둘째 자리가 아니라 첫째 자리로 반올림한다.소수 둘째 자리를 필요 이상으로 올린다. 은 와 사이에 있으며, 반올림은 이 두 수 가운데 하나를 고른다.소수 둘째 자리까지 반올림한다는 것은 소수 둘째 자리까지의 수 가운데 가장 가까운 것을 고르는 일이다. 에서 까지의 거리는 까지의 거리보다 짧다. 2.3강에서는 컴퓨터도 같은 방식으로, 다만 이진법으로 반올림하며, 그 때문에 소수 부분이 있는 수는 거의 모두 정확히 저장되지 않는다는 것을 보인다.복습: 입력, 출력, 오류
문제 4이전 단원에서어떤 프로그램의 5번째 줄에는
const int pages{12}선언이, 6번째 줄에는std::println("{}", pages);문장이 있다. 컴파일러는6:5: error: expected ',' or ';' before 'std'메시지를 출력한다. 결함은 어디에 있는가?6번째 줄은 올바르다. 컴파일러가 그 줄을 가리키는 것은 거기서 빠진 것을 알아차렸기 때문이다.std이름은 알아본다. 메시지는 그 앞에 세미콜론을 기대했다고 말한다.메시지에 적힌 종류는error쪽이지,warning쪽이 아니다. 실행 파일은 없다.컴파일러는 6번째 줄 첫머리에서 선언 뒤에 올 수 없는 것을 만났을 때 빠진 것을 알아차리고, 그 자리를 가리킨다. 가리킨 줄이 올바르다면 결함은 대개 그 앞 줄의 끝에 있다.복습: 프로그램의 해부
문제 5어떤 프로그램이
int a{2};선언과int b{7};선언을 한 뒤,a = b;문장과b = 10;문장을 실행한다. 마지막에a의 값은 얼마인가?대입이 두 변수를 묶어서, 마치a가b의 다른 이름인 것처럼 생각한다. 대입은 값을 복사할 뿐이다.a = b를 거꾸로 읽어, 마치a를b에 복사하는 것처럼 생각한다. 값은 오른쪽에서 왼쪽으로 간다.두 값을 더한다. 대입은 바꾸어 넣는 것이지 쌓는 것이 아니다.대입a = b문장은a에, 그 순간b의 값을 복사한다. 그 뒤로a와b는 서로 독립된 칸이며,b를 바꾸어도a는 바뀌지 않는다.복습: 변수와 메모리
문제 6수 13을 이진법으로 어떻게 쓰는가?
정직한 답이다. 2.2강에서 수를 이진법으로 쓰고 읽는 법을 배우며, 마무리 평가에서 다시 묻는다.연속 나눗셈의 나머지를 나온 순서대로 읽는다. 나머지는 마지막 것부터 처음 것까지 거꾸로 읽는다.무게를 잘못 더한다. .이진법에서는 각 자리의 무게가 그 오른쪽 자리의 두 배이며, 숫자는 0과 1뿐이다. 2.2강에서 이것을 배운다. 프로그램의 모든 정수가 이렇게 저장되기 때문이다.복습: 정수와 그 표현
문제 74바이트
int변수에 그 최댓값인 이 들어 있고, 프로그램이 거기에 1을 더한다. 무엇을 말할 수 있는가?표현의 한계를 무시한다. 이 수는 4바이트int변수에 들어가지 않는다.그렇게 동작하는 것은 부호 없는 정수이며, 그 산술은 모듈러 산술이다. 부호 있는 정수에 대해서는 표준이 그것을 보장하지 않는다.상수가 아닌 한, 컴파일러는 프로그램이 실행될 때 가질 값을 알지 못한다. 거의 언제나 아무 말 없이 컴파일한다.프로그램의 정수는 정해진 수의 비트를 가지며, 그에 따라 값의 범위가 유한하다. 부호 있는 정수의 값의 범위를 벗어나는 것은 덧셈의 사전 조건을 어긴다. 강좌의 새니타이저는 프로그램을 멈추지만, 그것이 없으면 프로그램은 무엇이든 출력할 수 있다. 2.2강에서 이것을 다룬다.복습: 정수와 그 표현
문제 8의 소수 표현은 유한한가?
은 근삿값이다. . 1이 되지 않는다.아무리 많이 써도 언제나 나머지가 남는다. 이 전개는 순환하며 유한하지 않다.이것은 수와 밑의 성질이지 도구의 성질이 아니다. 계산기는 근삿값을 보여 줄 뿐이다.기약분수의 소수 표현이 유한할 필요충분조건은 분모가 2와 5, 곧 밑 10의 소인수 외에 다른 소인수를 갖지 않는 것이다. 이진법에서는 조건이 더 엄격하여 분모가 2의 거듭제곱이어야 하며, 그래서 의 이진 표현은 유한하지 않다. 2.3강은 여기서 여러 결과를 끌어낸다.복습: 부동소수점 수
문제 9
std::println("{}", 0.1 + 0.2);문장의 출력은 무엇인가?컴퓨터가 정확한 십진수를 더한다고 생각한다. 실제로 더하는 것은 이진 근삿값이다.기본 표기를, 소수 둘째 자리로 반올림하는 형식 지정{:.2f}의 표기와 혼동한다.double값 두 개의 합은 정당하다. 놀라운 것은 그 결과이지 표기가 아니다.도 도 이진법으로 정확히 저장되지 않으며, 그 근삿값들의 합은 의 근삿값이 아니다.std::println함수는 저장된 값을 가려내는 가장 짧은 십진 표현을 출력하고, 그 표현이 차이를 드러낸다. 2.3강에서 그 차이가 어디서 오는지 자릿수 하나하나 설명한다.복습: 부동소수점 수
문제 10어떤 프로그램이
const double ratio{7 / 2};선언을 한 뒤ratio변수를 출력한다. 무엇이 나타나는가?변수의 자료형이 나눗셈 방식을 정한다고 생각한다. 그것을 정하는 것은 피연산자의 자료형이다.정수 나눗셈이 반올림한다고 생각한다. 실제로는 소수 부분을 버린다.값 3은 상수이며double타입으로 정확히 표현된다. 손실이 없으므로 중괄호는 그것을 받아들인다.나눗셈7 / 2식은 정수끼리의 나눗셈이며 정수 몫 3을 준다. 그 3이double타입으로 변환되는 것은 그 뒤이다. 어떤 나눗셈을 할지는 결과를 저장할 때가 아니라, 피연산자의 자료형에 따라 연산 안에서 정해진다. 3.5를 얻으려면 변환을 어디에 두어야 하는지 2.4강에서 배운다.
콘텐츠를 불러오는 중…