본문 바로가기
Topos Uranos

요약

이 수업은 강좌의 여덟 번째이자 마지막 단원, 곧 더 큰 프로그램을 다루는 단원을 연다. 단원의 목적을 설명한다. 이제 한 파일에도, 머릿속에도 들어가지 않는 프로그램을 구성하고, 검증하고, 디버깅하는 것이다. 단원의 세 수업과 그것들을 잇는 실을 소개하는데, 그 실은 강좌의 첫 수업에서 열린 고리(명세하기, 만들기, 검증하기)를 닫는다. 단원이 이미 안다고 전제하는 것, 곧 강좌 전체를 되짚는다. 단원이 해결하는 문제를 제시한다. 한 파일로 된 프로그램이 테스트에 쓴 데이터로는 잘 동작하면서 자기 명세의 경계에 있는 오류에 대해서는 침묵하는 문제이다. 테스트하는 것과 증명하는 것의 차이를 미리 소개한다. 그리고 단원이 최종 프로젝트와 C++ 프로그래밍 II 강좌에서 어디로 이어지는지 보여 준다.

학습 목표

  1. 단원의 내용 순서를 설명하고, 각 수업이 뒤이은 수업에 무엇을 보태는지 설명한다.
  2. 예를 들어, 함수의 선언과 정의의 차이, 함수를 규정하는 계약, 그리고 여러 파일을 하나의 프로그램으로 바꾸는 단계(컴파일과 링크)를 떠올린다.
  3. 예를 들어, 몇 개의 케이스로 프로그램을 테스트하는 것과 허용되는 모든 입력에 대해 프로그램이 올바르다고 증명하는 것의 차이를 미리 안다.
  4. 단원과 강좌를 마쳤을 때 할 줄 알아야 하는 것이 무엇인지 알고, 그것을 C++ 프로그래밍 II 강좌에서 배울 것과 구별한다.

입문 평가

단원을 시작하기 전에 출발점을 재어 두면 좋다. 이 평가는 점수를 매기지 않으며 학습의 방향을 잡아 준다. 처음 일곱 문항은 단원이 이미 안다고 전제하는 것(선언과 정의, 사전 조건, 6단원에 나온 함수의 계약, 링커의 메시지, 이진 탐색의 케이스, 추적표, 벡터 밖의 읽기)을 확인한다. 그 뒤의 세 문항은 수업 순서대로 단원의 핵심 개념을 다루며, 거기서는 “아직 모르겠다”가 정직한 답이다. 모든 답은 요점을 설명하고 그 요점을 다루는 수업을 알려 준다. 같은 능력은 종합 수업에서 다시 측정한다.

입문 평가

단원을 시작하기 전에 출발점을 확인해 보세요. 짧은 자기 평가입니다. 점수가 매겨지지 않으며 결과는 브라우저에만 저장됩니다.

  1. 문제 1이전 단원에서main 함수 앞에 쓴 int gcd(int a, int b); 줄은 무엇을 하는가?

  2. 문제 2이전 단원에서toBase(n, base) 함수의 사전 조건은 “n >= 0 조건과 2 <= base <= 10 조건”이다. 누가 그것을 보장해야 하는가?

  3. 문제 3이전 단원에서6.4강의 binarySearch(values, target) 함수는 target 값의 위치 하나를 돌려주고, 그 값이 없으면 values.size() 값을 돌려준다. 이 함수의 사전 조건은 무엇인가?

  4. 문제 4이전 단원에서어떤 프로그램이 오류 없이 컴파일되는데, 실행 파일을 빌드하면 undefined reference to `tetrahedral(int)' 메시지가 나온다. 어느 단계가 실패했는가?

  5. 문제 5이전 단원에서아래 케이스 묶음 가운데 이진 탐색을 가장 잘 시험하는 것은 어느 것인가?

  6. 문제 6이전 단원에서int a{0}; int b{1}; for (int i{0}; i < 4; ++i) { const int t{a + b}; a = b; b = t; } 코드를 실행한 뒤 a 변수와 b 변수의 값은 얼마인가?

  7. 문제 7이전 단원에서std::vector<int> v{1, 2}; std::println("{}", v[2]); 코드는 왜 강좌의 옵션으로는 멈추는데, 새니타이저 없이 -O2 옵션만으로 컴파일하면 아무 수나 출력할 수 있는가?

  8. 문제 8인클루드 가드를 갖춘 헤더가 inline 키워드 없이 double scale(double x) 함수를 (선언만 하는 것이 아니라) 정의하고, main.cpp 파일과 report.cpp 파일이 그 헤더를 포함한다. 프로그램을 빌드하면 어떻게 되는가?

  9. 문제 9어떤 함수가 신중하게 고른 자동 테스트 오백 개를 통과한다. 무엇을 주장할 수 있는가?

  10. 문제 10반복문 안의 total += k; 줄에 중단점이 있고, 프로그램이 그곳에서 세 번째로 멈춘다. 강조 표시된 줄은 무엇을 나타내는가?