요약
이 수업은 데이터와 그 자료형을 다루는 강좌의 둘째 단원을 마무리한다. 변수에서 컴파일러가 감시하는 상수까지 이어지는 개념의 사슬을, 정수의 이진 표현과 그 두 가지 오버플로, 근삿값으로서의 실수와 허용 오차, 코드로서의 문자, 정보를 잃는 형 변환을 거치며 다시 세운다. 그 가운데 어느 언어에서나 통하는 것과 C++에 고유한 것을 가르고, 단원의 정의되지 않은 동작을 컴파일러가 잡는 것, 새니타이저가 잡는 것, 아무도 잡지 못하는 것으로 나누어 모은다. 마무리 평가에서는 입문 평가의 기능을 되풀이하고, 단원 전체를 엮는 여섯 도전 과제로 끝난다.
학습 목표
- 문제의 각 데이터에 대해 그것이 가질 수 있는 값, 요구되는 정밀도, 그것으로 할 연산에 따라 자료형을 고르고 그 근거를 댄다.
- 주어진 프로그램에서 표현의 한계가 낳는 결과를 예측한다. 정수의 오버플로, 부동소수점의 반올림, 형 변환에 따른 정보 손실이 그것이다.
- 이름 있는 상수와 명시적 형 변환을 쓰고, 각 경우에 컴파일러가 무엇을 확인하는지 설명한다.
- 단원의 정의되지 않은 동작을 알아보고, 각 경우에 무엇이 그것을 잡아내며 어떻게 막는지 말한다.
- 단원에서 배운 것 가운데 어느 언어에서나 통하는 것과 C++에 고유한 것을 가른다.
단원에서 이룬 것
이 단원은 모든 데이터가 자료형과 함께 메모리에 놓이며, 그 자료형이 가질 수 있는 값과 차지하는 크기와 허용되는 연산을 정한다는 것, 그리고 그 한계들이 눈에 보이는 결과를 낳는다는 것을 가르치려 했다. 그 목적은 도입 수업이 이미 안다고 밝힌 것, 곧 강좌의 옵션으로 컴파일하고 실행하는 작업 순환, 서식 있는 출력, std::cin 객체를 쓰는 읽기, 컴파일러 메시지 읽기에만 기대어 이루어졌다. 도입 수업이 문제를 제기할 때 쓴 네 가지 계산의 프로그램은 이제 한 줄씩 설명할 수 있고, 고칠 수도 있다.
변수와 메모리
변수와 메모리 수업은 변수가 이름과 고정된 자료형과 바뀌는 값을 가진 메모리 칸이며, 자료형이 그 크기를 정하고 sizeof 연산자가 그것을 잰다는 것을 확립했다. 초기화와 대입을 구별했고, 중괄호가 손실 있는 변환을 거부함을 보였으며, 대입은 복사하는 것이지 묶는 것이 아니고 대체된 값은 사라진다는 것을 가르쳤다. 여기서 교환에 쓰는 보조 변수가 나온다. 프로그램의 상태를 변수들의 값 전체로 정의하고, 추적표로 그것을 따라가는 법을 가르쳤다. 이름 짓는 관례를 정하고, 단원의 첫 정의되지 않은 동작, 곧 한 번도 값을 받지 않은 변수의 읽기로 마무리했다.
정수와 그 표현
정수와 그 표현 수업은 밑 10, 2, 16의 위치적 기수법을 가르쳤다. 자료형이 비트를 가진다는 데서 그 값의 범위를 이끌어 냈다. 비트 패턴은 가지이며, 부호 없이는 부터 까지, 부호 있게는 2의 보수로 부터 까지를 나타내고, 음수가 양수보다 하나 더 많다. 두 가지 오버플로를 구별했다. 부호 없는 정수의 오버플로는 법 산술이며 정의되어 있고(0u - 1 식의 값은 의 값이다), 부호 있는 정수의 오버플로는 정의되지 않은 동작이며 새니타이저가 그것을 멈춘다. 부호 있는 정수를 부호 없는 정수와 비교하면 앞의 것이 변환되어 의 비교가 거짓이 됨을 보였고, 마지막으로 데이터의 예상 범위에 따라 정수 자료형을 고르는 기준을 제시했다.
부동소수점 수
부동소수점 수 수업은 실수가 부호, 지수, 이진 가수로 저장되며, 따라서 표현 가능한 값은 분모가 2의 거듭제곱인 유리수의 유한 집합임을 보였다. 여기서 의 수는 기계 안에 존재하지 않는다는 결론이 나왔다. 그 대신 가장 가까운 double 값이 저장되며, 0.1 + 0.2 식은 0.30000000000000004 문자열로 쓰인다. 이 수업은 반올림 한 번의 오차를 위에서 묶고, 오차가 누적되며 덧셈이 결합법칙을 만족하지 않게 됨을 보였다. 여기서 계산된 두 실수는 == 연산자로 비교하지 않고 근거 있는 허용 오차를 두고 그 거리로 비교한다는 결론을 이끌어 냈다. double 타입을 기본 실수 자료형으로 정하고, 무한대와 비수 NaN을 소개했다.
문자, 불리언, 형 변환, 상수
문자, 불리언, 형 변환, 상수 수업은 자료형이 비트를 읽는 규칙임을 보였다. char 타입은 바이트 하나를 저장하고 그 값은 문자의 ASCII 코드이며, 숫자와 글자는 연속된 코드를 가지므로 '7' - '0' 식은 7이다. bool 값은 참이나 거짓이며, 0이 아닌 수는 모두 참으로 변환된다. 암시적 형 변환을 살펴, 변환은 결과를 저장할 때가 아니라 연산 안에서 피연산자의 자료형에 따라 일어난다는 것을 확립했다. double r{7 / 2}에서 값은 3이다. 의도한 변환을 static_cast 연산자로 쓰는 법을 가르쳤는데, 이 연산자는 손실을 막는 것이 아니라 선언한다. 중괄호가 축소 변환을 거부함을 분명히 하고, 단원의 셋째 정의되지 않은 동작, 곧 들어가지 않는 실수를 정수로 변환하는 일을 보였다. 마지막으로 상수(const, constexpr, static_assert), 리터럴의 자료형, auto 키워드를 다루었다.
콘텐츠를 불러오는 중…